我一直在阅读帖子并尝试不同的方法,但我无法完成这项工作。
我希望能够在用户单击我的应用程序之前跟踪最后一个窗口。这样我可以把它带到前面并发送一个复制命令来检索用户选择的任何内容。
我考虑过使用挂钩来接收激活窗口的通知,但它没有按预期工作。我正在使用HSHELL_WINDOWACTIVATED全局挂钩来跟踪当前和最后一个活动窗口,但我总是让两个句柄相同,指向我的应用程序。
代码如下所示:
#pragma data_seg("ASEG")
HWND lastWindow = 0;
HWND currentWindow = 0;
#pragma data_seg()
#pragma comment(linker, "/section:ASEG,RWS")
HINSTANCE dllHandle;
BOOL APIENTRY DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
PVOID lpReserved )
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
dllHandle = hinstDLL;
return TRUE;
break;
}
}
LRESULT CALLBACK ShellHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode > 0)
{
switch (nCode)
{
case HSHELL_WINDOWACTIVATED: lastWindow = currentWindow;
currentWindow = (HWND)wParam;
break;
}
}
return ::CallNextHookEx(NULL, nCode,wParam,lParam);
}
extern "C" {
__declspec(dllexport) void Init()
{
SetWindowsHookEx(WH_SHELL, ShellHookProc, dllHandle, 0);
}
}
稍后我会使用 lastWindow 将该窗口置于最前面并发送 Ctrl+C 命令。
如果您为每个句柄调用 GetWindowTextA(..),那么当您第一次激活不同的窗口并返回应用程序时,lastWindow 将检索空白和 currentWindow 我的应用程序名称。任何连续的激活都会为 lastWindow 和 currentWindow 检索我的应用程序的名称。我不太明白为什么会这样。有任何想法吗?
谢谢!