Boa tarde, tenho 5 sistemas, 4 são sistemas que clientes usam dependendo de suas necessidades, 1 é o controle de clientes, o Formulário principal de ambos se chama frmPrincipal, e uso uma função do nosso amigo Churc, para executar o programa mesmo se já estiver aberto no Tray, (http://scriptbrasil.com.br/forum/index.php?showtopic=137378), ele não deixa abrir outro programa porque ele procura pelo nome frmPrincipal, se ve que já encontra aberto ele não abre nenhum otro.... o problema é que não posso renomear para frmPrincipal1, frmPrincipal2, pois há muitas coisas ligadas a esse formulário, e isso pode estragar tudo, ehehe, no entando segue o código de um dos programas, não lembro bem o nome da unit... acho que é o DPR:
program SIGI;
uses
Forms,
Windows,
Dialogs,
SysUtils,
Messages,
formtal in C:\blabla\form.pas,
..........................................,
.......................,
...................,
..........................;
{$R *.RES}
Var
HprevHist : HWND;
MutexHandle : THandle;
szParams: String = '';
procedure GetParams;
var
i: Integer;
begin
for i := 1 to ParamCount do
if (i = 1) then szParams := ParamStr(i) else
szParams := szParams + ' ' + ParamStr(i);
end;
function fromBackup: Boolean;
begin
Result := Pos('-reiniciar', LowerCase(szParams)) > 0;
end;
function OneInstanceAndRunning: Boolean;
begin
result := false;
if (MutexHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)
then
begin
GetParams;
if not fromBackup then
MessageDlg('O Programa já está em Execução nessa Maquina!', mtWarning,
[mbOK], 0);
result := true;
end;
end;
begin
GetParams;
MutexHandle := CreateMutex(nil, True, 'AdministraIgrejas');
if OneInstanceAndRunning and not (fromBackup) then
begin
hPrevInst := FindWindow('TFrmPrincipal', nil);
if hPrevInst <> 0 then
begin
SendMessage(hPrevInst, WM_SYSCOMMAND, SC_RESTORE, 0);
SendMessage(hPrevInst, WM_RESTFROMTRAY, 0, 0);
end;
CloseHandle(MutexHandle);
Halt;
end;
try
Application.Initialize;
Application.Title := 'AdministraIgrejas';
//frmTabelas := TfrmTabelas.Create(Application);
//frmTabelas.ShowModal;
//frmTabelas.Free;
frmAbertura := TfrmAbertura.Create(Application); // Cria o form de abertura
frmAbertura.Show;
frmAbertura.Update;
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.CreateForm(TdtmPrincipal, dtmPrincipal);
Application.CreateForm(TfrmSelAnoDiz, frmSelAnoDiz);
Application.CreateForm(TfrmSelMesAd, frmSelMesAd);
Application.CreateForm(TFrmPesqCaixa, FrmPesqCaixa);
Application.CreateForm(TFrmPesqBanco, FrmPesqBanco);
Application.CreateForm(TfrmSemConexao, frmSemConexao);
frmAbertura.Hide;
frmAbertura.Free;
Application.Run;
finally
if LongBool(MutexHandle) then
CloseHandle(MutexHandle);
end;
end.
Creio que o problema está bem naquela Linha hPrevInst := FindWindow('TFrmPrincipal', nil);, porem não sei como fazer de outra forma.....
Pergunta
Douglas Soares
Boa tarde, tenho 5 sistemas, 4 são sistemas que clientes usam dependendo de suas necessidades, 1 é o controle de clientes, o Formulário principal de ambos se chama frmPrincipal, e uso uma função do nosso amigo Churc, para executar o programa mesmo se já estiver aberto no Tray, (http://scriptbrasil.com.br/forum/index.php?showtopic=137378), ele não deixa abrir outro programa porque ele procura pelo nome frmPrincipal, se ve que já encontra aberto ele não abre nenhum otro.... o problema é que não posso renomear para frmPrincipal1, frmPrincipal2, pois há muitas coisas ligadas a esse formulário, e isso pode estragar tudo, ehehe, no entando segue o código de um dos programas, não lembro bem o nome da unit... acho que é o DPR:
program SIGI; uses Forms, Windows, Dialogs, SysUtils, Messages, formtal in C:\blabla\form.pas, .........................................., ......................., ..................., ..........................; {$R *.RES} Var HprevHist : HWND; MutexHandle : THandle; szParams: String = ''; procedure GetParams; var i: Integer; begin for i := 1 to ParamCount do if (i = 1) then szParams := ParamStr(i) else szParams := szParams + ' ' + ParamStr(i); end; function fromBackup: Boolean; begin Result := Pos('-reiniciar', LowerCase(szParams)) > 0; end; function OneInstanceAndRunning: Boolean; begin result := false; if (MutexHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then begin GetParams; if not fromBackup then MessageDlg('O Programa já está em Execução nessa Maquina!', mtWarning, [mbOK], 0); result := true; end; end; begin GetParams; MutexHandle := CreateMutex(nil, True, 'AdministraIgrejas'); if OneInstanceAndRunning and not (fromBackup) then begin hPrevInst := FindWindow('TFrmPrincipal', nil); if hPrevInst <> 0 then begin SendMessage(hPrevInst, WM_SYSCOMMAND, SC_RESTORE, 0); SendMessage(hPrevInst, WM_RESTFROMTRAY, 0, 0); end; CloseHandle(MutexHandle); Halt; end; try Application.Initialize; Application.Title := 'AdministraIgrejas'; //frmTabelas := TfrmTabelas.Create(Application); //frmTabelas.ShowModal; //frmTabelas.Free; frmAbertura := TfrmAbertura.Create(Application); // Cria o form de abertura frmAbertura.Show; frmAbertura.Update; Application.CreateForm(TfrmPrincipal, frmPrincipal); Application.CreateForm(TdtmPrincipal, dtmPrincipal); Application.CreateForm(TfrmSelAnoDiz, frmSelAnoDiz); Application.CreateForm(TfrmSelMesAd, frmSelMesAd); Application.CreateForm(TFrmPesqCaixa, FrmPesqCaixa); Application.CreateForm(TFrmPesqBanco, FrmPesqBanco); Application.CreateForm(TfrmSemConexao, frmSemConexao); frmAbertura.Hide; frmAbertura.Free; Application.Run; finally if LongBool(MutexHandle) then CloseHandle(MutexHandle); end; end.Creio que o problema está bem naquela Linha hPrevInst := FindWindow('TFrmPrincipal', nil);, porem não sei como fazer de outra forma.....
alguma ajuda? :rolleyes:
Obrigado
Editado por Douglas_SoaresLink para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.