Возможная реализация может включать перечисление верхнего уровня 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;