страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я

Шаблон минимального оконного приложения.

Это самый маленький код на 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)

Hosted by uCoz