Это самый маленький код на Delphi, который у меня получился. Окно создается особенное - "только для сообщений". Оно не видно на экране и не участвует в перечислении при вызове EnumWindows. Вот что про такие окна пишет MSDN:
Message-Only Windows A message-only window enables you to send and receive messages. It is not visible, has no z-order, cannot be enumerated, and does not receive broadcast messages. The window simply dispatches messages. To create a message-only window, specify the HWND_MESSAGE constant or a handle to an existing message-only window in the hWndParent parameter of the CreateWindowEx function. You can also change an existing window to a message-only window by specifying HWND_MESSAGE in the hWndNewParent parameter of the SetParent function. To find message-only windows, specify HWND_MESSAGE in the hwndParent parameter of the FindWindowEx function. In addition, FindWindowEx searches message-only windows as well as top-level windows if both the hwndParent and hwndChildAfter parameters are NULL. |
program minwnd;
uses Windows, Messages;
const WND_CLASS_NAME = 'MinWND';
var
wndclass: TWndClassEx;
wnd: HWND;
msg: TMsg;
function WndProc(hWnd: HWND; msg: UINT;wParam: WPARAM;
lParam: LPARAM): LongInt; stdcall;
begin
Result := 0;
case msg of
WM_DESTROY: PostQuitMessage(0);
else Result := DefWindowProc(hWnd,msg,wParam,lParam);
end;
end;
begin
ZeroMemory(@wndclass, SizeOf(TWndClassEx));
wndclass.cbSize := SizeOf(TWndClassEx);
wndclass.hInstance := HInstance;
wndclass.lpszClassName := WND_CLASS_NAME;
wndclass.lpfnWndProc := @WndProc;
if RegisterClassEx(wndclass) = 0 then ExitProcess(0);
wnd := CreateWindowEx(0,WND_CLASS_NAME,nil,0,0,0,0,0,
HWND(HWND_MESSAGE),0,HInstance,nil);
if wnd = 0 then ExitProcess(0);
ShowWindow(wnd, SW_NORMAL);
while GetMessage (msg, 0, 0, 0) do DispatchMessage (msg);
ExitProcess(msg.wParam);
end.
Один момент. Здесь я полагаюсь на модуль SysInit, который инициирует HInstance дескриптором запущенного модуля.
Если пользуешься кастрированным модулем SysInit
(для облегчения экзешника), то инициирруй HInstance
самостоятельно с помощью GetModuleHandle.
tripsin (C)