检测特定应用程序是否打开了任何菜单



如何检测特定应用程序(应用程序的窗口句柄和进程ID已知(当前是否打开了菜单(主菜单或弹出菜单(?

我对此进行了研究,但没有发现任何东西。

一个可能的实现可能涉及枚举目标应用程序窗口所属线程的顶级窗口,以搜索其中是否有任何一个是菜单窗口类。根据文档,这是"#32768"。

以下示例对定时器事件处理程序中的Windows7计算器执行相同操作。如果程序的菜单或上下文菜单处于打开状态,则示例输出调试字符串。

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;

相关内容

最新更新