Обработка элемента системного меню другого приложения

Я создал маленькое приложение, которое добавляет пункт в системное меню всех окон, и обрабатывает нажатие на него хуком (WH_CALLWNDPROC).

Код работает, когда окно получаетWM_SYSCOMMANDсообщений с существующими элементами (свернуть, развернуть и т. д.), но не фиксирует клики по моему пользовательскому элементу.

Проблема, по-видимому, в том, что я не получаю правильный идентификатор элемента, который я добавил, но я не знаю, почему.

Как я это сделаю?

Вот код для добавления элемента (работает):

      const
  SC_MYITEM = $020;
  MYITEM_STRING = 'My Item';
...

function AddMyMenuItem(hWnd: HWND): Boolean;
var
  WndMenu: HMENU;
begin
  Result := False;
  if IsWindowVisible(hWnd) then
  begin
    WndMenu := GetSystemMenu(hWnd, False);
    if WndMenu <> 0 then
      Result := AppendMenu(WndMenu, MF_STRING or MF_ENABLED, SC_MYITEM, PChar(MYITEM_STRING));
  end;
end;

И это код в файле dll, который запускает хук:

      const
  SC_MYITEM = $020;

function CallWndProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  Window: HWND;
begin
  Result := CallNextHookEx(0, nCode, wParam, lParam);
  if nCode < HC_ACTION then Exit;

  if (PCWPStruct(lParam)^.message = WM_SYSCOMMAND) and (PCWPStruct(lParam)^.wParam = SC_MYITEM) then
  begin
    Window := PCWPStruct(lParam)^.hwnd;
    //The procedure that processes the window...
  end;
end;

Как уже упоминалось, если я проверю эту строкуPCWPStruct(lParam)^.wParam = SC_MAXIMIZEЯ получу правильный результат, когда нажму максимизировать, и код запустится.

0 ответов

Другие вопросы по тегам