Обработка элемента системного меню другого приложения
Я создал маленькое приложение, которое добавляет пункт в системное меню всех окон, и обрабатывает нажатие на него хуком (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
Я получу правильный результат, когда нажму максимизировать, и код запустится.