0

我一直在阅读帖子并尝试不同的方法,但我无法完成这项工作。

我希望能够在用户单击我的应用程序之前跟踪最后一个窗口。这样我可以把它带到前面并发送一个复制命令来检索用户选择的任何内容。

我考虑过使用挂钩来接收激活窗口的通知,但它没有按预期工作。我正在使用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 检索我的应用程序的名称。我不太明白为什么会这样。有任何想法吗?

谢谢!

4

1 回答 1

1

我认为您可以使用 SetWinEventHook。这个钩子应该允许您捕获 EVENT_SYSTEM_FOREGROUND 消息,以便每次将窗口带到前台时,您都可以捕获窗口句柄。然后,当您的应用程序窗口被激活时,只需查看您捕获的最后一个值。

看到这个:https ://stackoverflow.com/a/4407715/1502289

此外,在您自己的代码中,您可以简单地进行比较以查看窗口句柄是否是您自己的窗口的句柄。如果没有,请保存句柄。

例子:

...
case HSHELL_WINDOWACTIVATED: 
if (lastWindow != [your own window's handle])
{
    lastWindow = (HWND)wParam;
}
break;
...
于 2012-10-31T18:46:37.767 回答