我必须使用其名称将窗口置于前景,例如“images”。 与
findWindowW(NULL, stringName)
我得到了流程的句柄(HWND
)。
然后用
SetForegroundWindow(windowHandle);
我认为我自动将它放到前台,但我必须按'Enter'。我做错了什么还是有另一种方法可以做到这一点?我也可以使用过程的PID。
我的最终目的是在将它放到前台后将CTRL + V等快捷方式发送到进程。谢谢。
答案 0 :(得分:2)
来自MSDN
系统限制哪些进程可以设置前景窗口。仅当满足下列条件之一时,进程才能设置前台窗口:
- 该过程是前台过程。
- 该过程由前台进程启动。
- 该过程收到了最后一个输入事件。
- 没有前台进程。
- 正在调试该过程。
- 前台进程不是现代应用程序或开始屏幕。
- 未锁定前景(请参阅LockSetForegroundWindow)。
- 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
- 没有菜单处于活动状态。
因此,如果您的程序与上述程序不符,则无法自动设置前景。
我认为您可以使用以下代码来处理您的案例,此link也可以提供帮助。
void SetForegroundWindowForce(HWND hWnd)
{
HWND hWndForeground = ::GetForegroundWindow();
if(hWndForeground == hWnd) return;
DWORD Strange = ::GetWindowThreadProcessId(hWndForeground, NULL);
DWORD My = ::GetWindowThreadProcessId(hWnd, NULL);
if( !::AttachThreadInput(My, Strange, TRUE) )
{
ASSERT(0);
}
::SetForegroundWindow(hWnd);
::BringWindowToTop(hWnd);
if( !::AttachThreadInput(My, Strange, FALSE) )
{
ASSERT(0);
}
}