Winapi 使用焦点启动windows应用程序 我在Visual C++中编写了一个没有MVC的小窗口应用程序。它非常小,只包含一个文本字段、一个OK按钮和一个Cancel按钮

Winapi 使用焦点启动windows应用程序 我在Visual C++中编写了一个没有MVC的小窗口应用程序。它非常小,只包含一个文本字段、一个OK按钮和一个Cancel按钮,winapi,visual-c++,Winapi,Visual C++,当用户开始打印时,应用程序由后台进程启动。打开应用程序时没有焦点,甚至不可见 对于用户来说,重要的是应用程序直接处于焦点位置,因此他们可以通过尽可能多的点击来使用它 我尝试了很多方法来关注应用程序: SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetForegroundWindow(hWnd); ShowWindow(hWnd, SW_RESTORE); SetFocus(hWnd); 我甚至在计

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

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

我尝试了很多方法来关注应用程序:

SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hWnd);
ShowWindow(hWnd, SW_RESTORE);
SetFocus(hWnd);
我甚至在计时器里重复了这些电话。所有这些都不起作用。现在我在MSDN上发现了一些评论:

系统限制哪些进程可以设置前台窗口。A. 只有满足以下条件之一时,进程才能设置前景窗口 条件是正确的:

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.

谁知道这是一个解决方案?

< p>现在,这是来自java开发者而不是VisualC++开发者,但是你可以把框架/窗口/WITWEL?在Java中,如果您有一个
JFrame
,比如说
myJFrame
,您可以调用
myJFrame.setAlwaysOnTop(true)
,它将位于所有其他窗口的顶部。这似乎是一个简单的解决问题的方法,但是如果用户在屏幕上阻止他们的东西,这可能不太理想。

现在,这是来自java开发者而不是VisualC++开发者,但是你能把框架/窗口/什么东西——ITS叫做“EnvivVisual C”永远放在上面吗?在Java中,如果您有一个
JFrame
,比如说
myJFrame
,您可以调用
myJFrame.setAlwaysOnTop(true)
,它将位于所有其他窗口的顶部。这似乎是解决您的问题的一个简单的解决方法,但是如果它在屏幕上阻止了用户的某些内容,用户可能不希望这样做。

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

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

似乎可以完成这项工作

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);
}似乎能胜任这项工作

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);

}

这不起作用,因为窗口一开始就不显示。哦,我的错。我误解了。我以为它会出现在所有其他窗口的下面。这不起作用,因为窗口一开始就没有显示。哦,我的糟糕。我误解了。我还以为它就在其他所有的窗户下面出现了呢。真不令人满意。如果我的应用程序不直接弹出,我会遇到真正的用户接受问题。是否有任何windows选项或其他方法来阻止此行为或允许我的应用程序弹出?最后一种方法是模拟一个点击任务列表,但这确实是我最不想做的事情。doNo,没有这样的选项,否则所有程序都会自己设置这个选项。有关这场“军备竞赛”的讨论,请参阅和相关帖子。您必须使用通知区域或重新考虑您的UI。你的用例是什么?您的兼容性要求是什么?那些“中断”并弹出的应用程序的一个问题是,它们最终可能会无意中“窃取输入”。在过去的几次中,我在一些文本编辑器中不断键入,出现一些随机弹出的对话框,我在键入时点击空格键,然后对话框消失,因为空格键触发了一些“确定”或“取消”按钮——所有这些都是在我有机会阅读对话框之前发生的!这类问题正是SetForeGroundIndow以这种方式被“禁用”的原因,也是为什么引入了通知气球的原因。这非常不令人满意。如果我的应用程序不直接弹出,我会遇到真正的用户接受问题。是否有任何windows选项或其他方法来阻止此行为或允许我的应用程序弹出?最后一种方法是模拟一个点击任务列表,但这确实是我最不想做的事情。doNo,没有这样的选项,否则所有程序都会自己设置这个选项。有关这场“军备竞赛”的讨论,请参阅和相关帖子。您必须使用通知区域或重新考虑您的UI。你的用例是什么?您的兼容性要求是什么?那些“中断”并弹出的应用程序的一个问题是,它们最终可能会无意中“窃取输入”。在过去的几次中,我在一些文本编辑器中不断键入,出现一些随机弹出的对话框,我在键入时点击空格键,然后对话框消失,因为空格键触发了一些“确定”或“取消”按钮——所有这些都是在我有机会阅读对话框之前发生的!这类问题正是SetForeGroundIndow以这种方式被“禁用”的原因,也是引入通知气球的原因。