Tecnicamente, uma maneira de obter esse efeito é abrir um objeto de sincronização acessível global, como um canal nomeado. O segundo processo detectará um objeto existente e, de alguma forma, informará ao primeiro processo para abrir o arquivo.
E é exatamente isso que o Sublime Text faz também. Você pode observar isso com o Process Explorer (SysInternals) :
- Execute o Process Explorer como administrador
- Executar texto sublime
- Selecione o texto sublime na lista de processos
- Pressione Ctrl + H para mostrar o painel inferior das alças
- Encontre um identificador do tipo Mutant com "Sublime Text 2" em seu nome. Pode parecer com
\Sessions\BaseNamedObjectsd3560c7bb75b0aede072672a3c001bb-Sublime Text 2
- Clique com o botão direito do mouse no Mutant
- Selecione "Fechar identificador"
- Iniciar outra instância do texto sublime
Agora você sabe como iniciar uma nova instância do Sublime Text. Claro que você quer automatizar este processo. O fluxo de sequência necessário agora é conhecido para você:
- Encontre todos os processos de
sublim_text.exe
, por ex. usando EnumProcesses (MSDN) - Percorra a lista de identificadores, por exemplo usando NtQuerySystemInformation com
SystemHandleInformation
- Feche todos os Mutantes com "Sublime Test 2" no nome, por ex. usando CloseHandle (MSDN) .
Você precisará fechar o identificador do novo processo também, já que o novo processo o criará novamente.
O Handle (Sysinternals) é útil para configurar um script que atende ao que você precisa. Pode encontrar uma alça (linha 1) e fechar uma alça (linha 2)
Handle -p sublime_text.exe -a Sublime | find "Mutant"
Handle -c <handle> -p <pid> -y
No seguinte script completo, adapte o nome de usuário. Copie handles.exe
para o mesmo diretório e execute o arquivo em lote como administrador (pois handles.exe
precisa de direitos de administrador:
@echo off
REM Just in case this is run multiple times from a command line
set pid=
set handle=
REM Make the working directory the directory of the batch file
cd /d %~dp0
REM Find PID and Handle
for /f "tokens=3,6" %%i in ('handle -p sublime_text.exe -a Sublime -accepteula ^| find "Mutant"') do set pid=%%i & set handle=%%j
if "%pid%"=="" goto sublime
REM Close the handle
handle -c %handle:~0,-1% -p %pid% -y > nul
:sublime
runas /user:Username sublime_text.exe
if errorlevel 1 pause