我想将焦点设置为特定的用户应用程序(使用进程名称),而是从“在后台”运行的代码而不是活动进程中。我需要抓住一个全球性的事件,并通过将特定的应用程序放在前面来做出反应。
前提条件:-应用程序1在顶部运行-应用程序2在运行但未处于活动状态-我的->应用程序<-在运行但未处于活动状态,只是在运行以处理该问题
动作:-我的应用程序检测到特定的Windows事件(例如,鼠标双击)-触发应用程序2进入前台
预期:-应用程序2现在处于活动状态,重点是它
SetForegroundWindow()和SwitchToThisWindow()都不起作用,因为我的应用程序不是触发切换的活动应用程序。它必须随时“从后台”触发它。有人有解决方案吗?示例代码的示例将是非常感谢的。
[编辑]:我找到了一种解决方案-我使用AttachThreadInput()函数,并将窗口的GetWindowThreadProcessId()作为第一个参数,而GetCurrentThreadID()作为第二个参数。当然,第三是正确的。SetActiveWindow()和SetForegroundWindow()都可以工作,但是...仅在Visual Studio(2013)中进行调试时才是不幸的。当我同时在Debug和Release版本中运行.exe文件时,焦点不会触发。你们当中有人知道为什么会这样吗?
好的,我在网上找到了解决方法。我将“ 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));
有趣的问题,但有效!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句