我正在尝试开发一个可以将另一个应用程序带到前台的应用程序,因此我使用 Spy++ 分析了 Windows 资源管理器(Alt-Tab)的行为,对我来说有趣的是哪个应用程序或哪个 threis 实际激活,所以我监视消息 WM_ACTIVATEAPP .
WM_ACTIVATEAPP,当wparam=false时,根据MSDN文档,lparam表示被激活线程的threadid。
这是我的 Spy++ 日志中的一个示例:<00037> 00030DD6 S WM_ACTIVATEAPP fActive:False dwThreadID:000008F0
我的问题是:给定的 dwThreadID 8F0应该是被激活的应用程序。但是:当我切换到 Spy++ 中的线程视图并搜索线程8F0 时,我什么也没找到。该线程似乎根本不存在。那么如何将此线程 ID 转换为进程 ID?
我正在使用 System.Windows.Automation 从组框中的标签中获取一些 UI 控件文本值。我正在尝试使用 spy++ 来获取我正在寻找的控件名称。

AutomationElement Root = AutomationElement.RootElement;
AutomationElement MainForm = Root.FindFirst(TreeScope.Descendants,new PropertyCondition(AutomationElement.AutomationIdProperty,"control name im looking for"));
Run Code Online (Sandbox Code Playgroud)
什么值代表我要搜索的内容?例如,我会将其更改为... ...AutomationIdProperty,"Window 00031BB0"));
我不确定 spy++ 提供的所有信息实际上代表什么。
感谢您的任何帮助!
我想打开Microsoft Security Essential程序,然后单击VC立即扫描按钮.我可以找到窗口,但找不到控制权.这是我的代码,当我运行此代码时显示控件未找到.我尝试在运行程序中单击"浏览"按钮测试此代码,但是当我尝试使用Microsoft Security Essential时,它找不到控件.我不知道为什么这个控件可能在Tab中.如何使用FindWindowEx()单击Microsoft Security Essential中的立即扫描按钮?
int run_ms(){
ShellExecute(NULL, L"open", L"C:/Program Files/Microsoft Security Client/msseces.exe", NULL, NULL, SW_SHOWNORMAL);
HWND w;
w=FindWindow(NULL, L"Microsoft Security Essentials");
if(w==NULL)
MessageBox(NULL,L"Not found",L"",MB_OK);
else{
HWND cb;
cb = FindWindowEx(w,NULL,NULL,_T("&Scan now"));
if(cb!=NULL)
{
SendMessage(cb,WM_LBUTTONDOWN, NULL,NULL);
SendMessage(cb,WM_LBUTTONUP, NULL,NULL);
}
else
MessageBox(NULL,L"Control not found",L"",MB_OK);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Microsoft Security Essential中使用带有按钮的Spy ++,它显示如下
Caption : &Scan now
Class : ALT:BUTTON
I use FindWindowEx() like this cb = FindWindowEx(w,NULL,NULL,_T("&Scan now"));
Run Code Online (Sandbox Code Playgroud)
但它没有找到控制.
我正在Delphi XE2中开发一个应用程序,它通过EnumWindows和EnumChildWindows函数检查一个运行应用程序的窗口,该窗口也是用Delphi编写的.
这是主要代码(改编自一个例子:http://www.swissdelphicenter.ch/torry/showcode.php?id = 410)
function EnumChildWindowsProc(Wnd: HWnd; Form: TForm1): Bool; export;
{$ifdef Win32} stdcall; {$endif}
var
Buffer: array[0..99] of Char;
begin
GetWindowText(Wnd, Buffer, 100);
if StrPas(Buffer) = '' then Buffer := 'Empty';
new(AWindows);
with AWindows^ do
begin
WindowHandle := Wnd;
WindowText := StrPas(Buffer);
end;
CNode := Form1.TreeView1.Items.AddChildObject(PNode,
AWindows^.WindowText + ':' +
IntToHex(AWindows^.WindowHandle, 8), AWindows);
if GetWindow(Wnd, GW_CHILD) = 0 then
begin
PNode := CNode;
Enumchildwindows(Wnd, @EnumChildWindowsProc, 0);
end;
Result := True;
end;
function EnumWindowsProc(Wnd: HWnd; …Run Code Online (Sandbox Code Playgroud) 虽然我们都在这个话题上纠缠不清,但事实证明,虽然 UWP 应用程序确实有顶级窗口,您可以向它们发送(明智的)消息 (*),并且这些消息确实通过并产生了预期的效果,Spy++似乎永远不会看到这些消息,或者确实看到 Windows 本身可能发送的任何其他消息。
任何人都可以对此有所了解吗?
只是为了提供一些背景信息,Spy 可以毫无问题地定位和检查这些窗口(“查找工具”工作正常),但消息记录完全静音。我已经测试了设置应用程序、屏幕键盘、日历和计算器,并且在 Spy 中勾选了所有适当的“附加窗口”复选框。我还使用 Process Explorer 来检查 Spy 是否以“高完整性级别”运行(因为它大概是提升的),并且确实如此。
(*) 是的,我知道我们不应该这样做,但是,你知道。