0

我正在用 Visual C++ 编写一个没有 MVC 的小型 Windows 应用程序。它真的很小,它只包含一个文本字段、一个确定按钮和一个取消按钮。

当用户开始打印时,应用程序由后台进程启动。打开应用程序时没有获得焦点,甚至不可见。

对于用户来说,应用程序直接处于焦点是很重要的,因此他们可以通过尽可能多的点击来使用它。

我尝试了很多方法来使应用程序成为焦点:

SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hWnd);
ShowWindow(hWnd, SW_RESTORE);
SetFocus(hWnd);

我什至在计时器中重复了这个调用。这一切都行不通。现在我在 MSDN 上找到了一些注释:

系统限制哪些进程可以设置前台窗口。只有当下列条件之一为真时,进程才能设置前台窗口:

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
No menus are active.

有人知道解决方法吗?

4

3 回答 3

4

没有解决方法。这种新的 Windows 行为的全部意义在于防止应用程序自行将自己带到前台并造成麻烦。在您的情况下,我建议使用通知图标并在必要时显示气球消息而不是窗口。但是,即使在这种情况下,您的通知图标也可能被用户隐藏并且没有解决方法,原因与上述相同。

于 2012-06-13T05:24:53.910 回答
0

现在,这是来自 Java 开发人员而不是 Visual C++ 开发人员,但您可以将 frame/window/whatever-its-call-in-visual-c 设置为始终位于顶部吗?在 Java 中,如果你有一个JFrame,比如说myJFrame,你可以调用myJFrame.setAlwaysOnTop(true)它,它会保持在所有其他窗口的顶部。这似乎是解决您的问题的简单解决方法,但是如果它在屏幕上阻止了他们的某些内容,则用户可能不希望这样做。

于 2012-06-13T05:24:23.140 回答
0

http://www.thescarms.com/vbasic/alttab.aspx似乎可以完成这项工作

void forceToFront(HWND hWnd) {
HWND foregroundWindow = GetForegroundWindow();

if (foregroundWindow == hWnd) {
    // Window is already Foreground-window
    return;
}

if (SetForegroundWindow(hWnd)) {
    // could set window to foreground without any tricks
    return;
}

// attach thread of foreground-window to this window
DWORD foregroundThread = GetWindowThreadProcessId(foregroundWindow, NULL);
DWORD myThread = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(foregroundThread, myThread, true);
SetForegroundWindow(hWnd);
AttachThreadInput(foregroundThread, myThread, false);

}

于 2012-06-13T18:12:00.413 回答