Определить, есть ли у определенного приложения c открытое меню - PullRequest
1 голос
/ 06 марта 2020

Как определить, есть ли у определенного c приложения (где известны дескриптор окна приложения и идентификатор процесса) какое-либо МЕНЮ, открытое (главное меню или всплывающее меню)?

Я исследовал это, но ничего не нашел.

1 Ответ

2 голосов
/ 06 марта 2020

Возможная реализация может включать перечисление верхнего уровня windows потока, которому принадлежит окно целевого приложения, для поиска, если какой-либо из них является классом окна меню. Это '# 32768' согласно документации .

Следующий пример делает то же самое для калькулятора Windows 7 в обработчике событий таймера. В примере выводится строка отладки, если открыто меню программы или контекстное меню.

function EnumThreadWindowsCallback(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
  MenuWndClass = '#32768';
var
  ClassName: array[0..256] of Char;
begin
  Result := True;
  if (GetClassName(hwnd, ClassName, Length(ClassName)) = Length(MenuWndClass)) and
      (ClassName = MenuWndClass) then begin
    PBoolean(lparam)^ := True;
    Result := False;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Wnd: HWND;
  ThrId: DWORD;
  MenuWnd: Boolean;
begin
  Wnd := FindWindow('CalcFrame', 'Calculator');
  if Wnd <> 0 then begin
    ThrId := GetWindowThreadProcessId(Wnd);
    MenuWnd := False;
    EnumThreadWindows(ThrId, @EnumThreadWindowsCallback, LPARAM(@MenuWnd));
    if MenuWnd then
      OutputDebugString('active menu');
  end;
end;
...