您可以使用该WM_ACTIVATE
消息。Windows 在激活或停用窗口时发送此消息。如果用户切换到另一个应用程序,则应用程序的当前窗口会收到一条WM_ACTIVATE
消息,告诉它它正在被停用。
这是一个小示例,用于在用户切换到另一个应用程序时设置/删除最上面的标志(考虑hFloatingWindow
到浮动窗口的窗口句柄):
LRESULT __stdcall YourWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
/* ... */
case WM_ACTIVATE:
DWORD pid = 0;
GetWindowThreadProcessId((HWND)lParam, &pid);
if (pid != GetCurrentProcessId()) /* switch to another task? */
{
if ((wParam == WA_ACTIVE) || (wParam == WA_CLICKACTIVE))
{
if (SetWindowPos(hFloatingWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE)
{
/* handle error */
}
}
else
{
if (SetWindowPos(hFloatingWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE)
{
/* handle error */
}
}
}
return (0); /* message processed */
/* ... */
}
请注意,您必须将代码添加WM_ACTIVATE
到应用程序的所有窗口过程中。这是必要的,因为用户可以从任何处于活动状态的窗口切换到另一个任务。如果当前活动窗口不处理WM_ACTIVATE
如上所示的消息,则不会删除最上面的标志。