C++ 如何将焦点切换到不同的应用程序C++;/WinAPI

C++ 如何将焦点切换到不同的应用程序C++;/WinAPI,c++,C++,我想将焦点设置为特定的用户应用程序(使用进程名),但要从“后台”运行的代码而不是活动进程。我需要捕捉一个全局事件,并通过将特定应用程序带到前端来做出反应 先决条件: 应用程序1在顶部工作 应用程序2正在工作但未激活 我的应用程序3正在工作但未处于活动状态,只是运行以处理问题 行动: my application 3检测到特定的Windows事件(例如,鼠标双击) 它触发应用程序2进入前台 预期: 应用程序2现在处于活动状态,重点是它 SetForegroundWindow()和Swi

我想将焦点设置为特定的用户应用程序(使用进程名),但要从“后台”运行的代码而不是活动进程。我需要捕捉一个全局事件,并通过将特定应用程序带到前端来做出反应

先决条件:

  • 应用程序1在顶部工作
  • 应用程序2正在工作但未激活
  • 我的应用程序3正在工作但未处于活动状态,只是运行以处理问题
行动:

  • my application 3检测到特定的Windows事件(例如,鼠标双击)
  • 它触发应用程序2进入前台
预期:

  • 应用程序2现在处于活动状态,重点是它
SetForegroundWindow()
SwitchToThisWindow()
都不起作用,因为我的应用程序不是触发开关的活动应用程序。它必须在任何时候“从后台”触发它。有人有解决办法吗?示例性代码的示例将非常感谢


[编辑]:我找到了一种解决方案-我使用
AttachThreadInput()
函数,并将窗口的
GetWindowThreadProcessId()
作为参数作为第一个激活参数,将
GetCurrentThreadID()作为第二个参数。当然,
TRUE
作为第三名。比
SetActiveWindow()
SetForegroundWindow()
都有效,但是。。。不幸的是,只有在Visual Studio中调试时(2013年)。当我在调试和发布版本中运行.exe文件时,不会触发焦点。有人知道为什么会这样吗?

好的,我在网上找到了一个解决办法。我将
Alt
键作为输入发送到系统。然后我可以成功地使用
setforegroughindow()
。之后,当然应该释放
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));

微软对于不允许非重点流程设置重点非常认真。