![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
Xplorer |
![]()
Сообщение
#2
|
Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 52 Регистрация: 4-February 08 Пользователь №: 8 Спасибо сказали: 30 раз(а) ![]() |
Handle'у процесса посылал WM_CLOSE - без толку. Это только формам посылать надо - как я сейчас и делаю. WM_DESTROY не пробовал. Все сообщения посылаются только окнам (HWND). Достаточно послать WM_CLOSE только главному окну. WM_DESTROY посылает сама Windows при уничтожении окна.Но винда как-то умудряется корректно закрывать приложения... Есть сообщения WM_QUERYENDSESSION и WM_ENDSESSION.-=CHE@TER=- Попробуй такой вариант: CODE program Project1; uses Windows, Messages, Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var Mutex: THandle; Wnd: hWnd; procedure ErrHalt(const Msg: string); begin MessageBox(0, PChar(Msg), 'Error', MB_ICONHAND or MB_OK); Halt; end; begin Mutex := OpenMutex(MUTEX_ALL_ACCESS, false, '851137EC-3D96-4EA6-817B-30969CCF477B'); if Mutex <> 0 then begin Wnd := FindWindow('AFDF47C5-D586-47F2-8091-C6FBAEF8780A', nil); if Wnd = 0 then ErrHalt('Window not found'); SendMessage(Wnd, WMU_MYCLOSE, 0, 0); repeat CloseHandle(Mutex); Mutex := OpenMutex(MUTEX_ALL_ACCESS, false, '851137EC-3D96-4EA6-817B-30969CCF477B'); until Mutex = 0; end; Mutex := CreateMutex(nil, false, '851137EC-3D96-4EA6-817B-30969CCF477B'); if Mutex = 0 then ErrHalt('CreateMutex failed'); if GetLastError = ERROR_ALREADY_EXISTS then ErrHalt('Mutex already exists'); Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; CloseHandle(Mutex); end. CODE unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const WMU_MYCLOSE = WM_USER + 1; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private procedure wmuMyClose(var Msg: TMessage); message WMU_MYCLOSE; protected procedure CreateParams(var Params: TCreateParams); override; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.CreateParams(var Params: TCreateParams); begin inherited; Params.WinClassName := 'AFDF47C5-D586-47F2-8091-C6FBAEF8780A'; end; procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption := ParamStr(0); Label2.Caption := FormatDateTime('d-mm-yyyy hh:mm:ss.zzz', now); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Sleep(1000); end; procedure TForm1.wmuMyClose(var Msg: TMessage); begin Application.Terminate; end; end. |
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 21:17 |