在开发“518抽奖软件”的时候,需要用到窗口化、全屏化、移到扩展屏的功能。 网上找的代码都不够全面,有时候会被任务栏挡住。所以自己写了一个代码,下面的代码是商业产品上正式使用的代码,比一般网上随便写的代码好的多,各种情况测试都通过。
if (m_wndPos.wndMode == WNDMODE_WINDOW) m_hMain = CreateWindow(WNDCLASS_NAME, g_title, WS_POPUP, m_wndPos.x, m_wndPos.y, m_wndPos.w, m_wndPos.h, NULL, NULL, m_hInst, NULL); else m_hMain = CreateWindow(WNDCLASS_NAME, g_title, WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, m_hInst, NULL); ShowWindow (m_hMain, SW_SHOW); UpdateWindow (m_hMain); SetWindowPos(m_hMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
case WM_ACTIVATEAPP: if ((BOOL)wParam) { SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } else { SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); PostMessage(hWnd, WM_APP_BRINGTOTOP, 0, 0); } break; case WM_APP_BRINGTOTOP: BringWindowToTop(GetForegroundWindow()); break; case WM_SHOWWINDOW: if (!(BOOL)wParam) return DefWindowProc(hWnd, message, wParam, lParam); else SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); break; case WM_LBUTTONDOWN: BringWindowToTop(g_app.m_hMain); break;
wndPos_t& wp = g_app.m_wndPos; int cx = GetSystemMetrics(SM_CXSCREEN); int cy = GetSystemMetrics(SM_CYSCREEN); if (wmId == IDM_window) { if (wp.wndMode == WNDMODE_EXSCRN) SetCursorPos(cx - 1, cy - 1); //鼠标移回主窗口 wp.wndMode = WNDMODE_WINDOW; MoveWindow(g_app.m_hMain, wp.x, wp.y, wp.w, wp.h, TRUE); Sleep(16); BringWindowToTop(g_app.m_hMain); } else if (wmId == IDM_fuscrn) { if (wp.wndMode == WNDMODE_EXSCRN) SetCursorPos(cx - 1, cy - 1); //鼠标移到扩展屏 wp.wndMode = WINMODE_FUSCRN; MoveWindow(g_app.m_hMain, 0, 0, cx, cy, TRUE); } else if (wmId == IDM_exscrn) { RECT rc; if (!g_app.get_exscrn(rc)) MessageBox(g_app.m_hMain, L"无扩展屏", g_title, MB_OK | MB_ICONWARNING); else { wp.wndMode = WNDMODE_EXSCRN; MoveWindow(g_app.m_hMain, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); SetCursorPos(rc.right - 1, rc.bottom - 1); } }
BOOL Tapp::get_exscrn(RECT& rcExscrn) { RECT rc = { 0 }; EnumDisplayMonitors(NULL, NULL, Callback_enumMonitors, (LPARAM)&rc); if (rc.left == 0 && rc.top == 0 && rc.right == 0 && rc.bottom == 0) return FALSE; rcExscrn = rc; return TRUE; } static BOOL CALLBACK Callback_enumMonitors(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { RECT* rc = (RECT*)dwData; MONITORINFO mi = { 0 }; mi.cbSize = sizeof(MONITORINFO); GetMonitorInfo(hMonitor, &mi); if (mi.dwFlags != MONITORINFOF_PRIMARY) { *rc = mi.rcMonitor; return FALSE; } return TRUE; }