![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Ну примеров полно в интернете.
Например, я делаю так: В dpr файле: Код:
program Project1; uses ... {$R *.res} function AllowSetForegroundWindow(dwProcessId: DWORD): BOOL; stdcall; external 'user32.dll'; function IsSecondCopy : Boolean; var hMutex : THandle; begin Result := False; WndMessage := RegisterWindowMessage(PChar(GetMessageName(AppName))); hMutex := CreateMutex(Nil, True, PChar(GetMutexName(AppName))); If hMutex<>0 Then If GetLastError=ERROR_ALREADY_EXISTS Then Begin AllowSetForegroundWindow(DWORD(-1)); PostMessage(HWND_BROADCAST,WndMessage,0,0); Result := True; End; end; begin If IsSecondCopy Then Halt(0); Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.HookMainWindow(MainForm.HookMessageProc); Application.Run; end. В главной форме: Код:
const AppName = 'Password Keeper'; type TMainForm = class(TForm) ... public { Public declarations } function HookMessageProc(var Message : TMessage) : Boolean; end; ... function TMainForm.HookMessageProc(var Message : TMessage) : Boolean; begin Result := False; If Message.Msg = WndMessage Then Begin If WindowState = wsMinimized Then Application.Restore; Application.BringToFront; SetForegroundWindow(Self.Handle); Result := True; End; end; Это по поводу второй копии. По поводу передачи данных (небольших), надо пользовать сообщение WM_COPYDATA. Код можно посмотреть, например, тут: https://stackoverflow.com/questions/...ia-wm-copydata |