我想将焦点设置为特定的用户应用程序(使用进程名称),但是要从后台运行的代码"#34;不是来自积极的过程。我需要抓住一个全局事件并通过将特定应用程序带到前面来做出反应。
前提条件: - 应用程序1在顶部工作 - 应用程序2工作但不活跃 - 我的 - >应用程序< - 工作但不活跃,只是运行来处理问题
操作: - 我的应用程序检测到特定的Windows事件(例如鼠标双击) - 它触发应用程序2前进
预期: - 应用程序2现已激活,重点是它
SetForegroundWindow()和SwitchToThisWindow()都不起作用,因为我的应用程序不是触发切换的活动应用程序。它必须从后台触发它"随时。有人有解决方案吗?非常感谢示例代码的示例。
[编辑]:我找到了一种解决方案 - 我使用AttachThreadInput()函数并将作为参数的GetWindowThreadProcessId()作为参数放置为第一个参数和GetCurrentThreadID()作为第二个参数。当然是第三个。比SetActiveWindow()和SetForegroundWindow()都工作但是......不幸的是只在Visual Studio(2013)中进行调试时。当我在Debug和Release版本中运行.exe文件时,焦点不会触发。你们中有谁知道为什么会这样吗?
答案 0 :(得分:1)
好的,我在网上找到了解决方法。我发送'Alt'键作为系统的输入。然后我可以成功使用SetForegroundWindow()。之后,当然应该释放'Alt'键。
//set up a generic keyboard event
INPUT keyInput;
keyInput.type = INPUT_KEYBOARD;
keyInput.ki.wScan = 0; //hardware scan code for key
keyInput.ki.time = 0;
keyInput.ki.dwExtraInfo = 0;
//set focus to the hWnd (sending Alt allows to bypass limitation)
keyInput.ki.wVk = VK_MENU;
keyInput.ki.dwFlags = 0; //0 for key press
SendInput(1, &keyInput, sizeof(INPUT));
SetForegroundWindow(hWnd); //sets the focus
keyInput.ki.wVk = VK_MENU;
keyInput.ki.dwFlags = KEYEVENTF_KEYUP; //for key release
SendInput(1, &keyInput, sizeof(INPUT));
有趣的问题,但它的确有效!