16,548
社区成员




void MainLoop(HWND hWnd)
{
if (GetAsyncKeyState(VK_F1) & 0x8000)
{
DWORD newWndStyle = newWndStyle = (WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU) & ~WS_VISIBLE;
SetWindowLong(hWnd, GWL_STYLE, newWndStyle);
RECT rcWnd = { 0, 0, 1366, 768 };
AdjustWindowRect(&rcWnd, newWndStyle, FALSE);
int x = (GetSystemMetrics(SM_CXSCREEN) - (rcWnd.right-rcWnd.left)) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - (rcWnd.bottom-rcWnd.top)) / 2;
UINT flag = 0;
SetWindowPos(hWnd, HWND_NOTOPMOST, x, y, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, flag|SWP_NOACTIVATE|SWP_SHOWWINDOW);
Sleep(500);
}
if (GetAsyncKeyState(VK_F2) & 0x8000)
{
DWORD newWndStyle = newWndStyle = WS_OVERLAPPEDWINDOW & (~WS_MAXIMIZEBOX) & (~WS_SIZEBOX);
SetWindowLong(hWnd, GWL_STYLE, newWndStyle);
RECT rcWnd = { 0, 0, 800, 600 };
AdjustWindowRect(&rcWnd, newWndStyle, FALSE);
int x = (GetSystemMetrics(SM_CXSCREEN) - (rcWnd.right-rcWnd.left)) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - (rcWnd.bottom-rcWnd.top)) / 2;
UINT flag = 0;
SetWindowPos(hWnd, HWND_NOTOPMOST, x, y, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, flag|SWP_NOACTIVATE|SWP_SHOWWINDOW);
Sleep(500);
}
}
#include <windows.h>
#include <crtdbg.h>
void GetWindowCreateInfo(int* pOutX, int* pOutY, int* pOutWidth, int* pOutHeight, DWORD* pOutWndStyle, char* szOutTileName, int title_name_size=256)
{
*pOutX = (GetSystemMetrics(SM_CXSCREEN)-800) / 2;
*pOutY = (GetSystemMetrics(SM_CYSCREEN)-600) / 2;
*pOutWidth = 800;
*pOutHeight = 600;
*pOutWndStyle = WS_OVERLAPPEDWINDOW & (~WS_MAXIMIZEBOX) & (~WS_SIZEBOX); // 无标题栏:WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU;
strcpy_s(szOutTileName, title_name_size, "Test");
}
void Init(HWND hWnd, const char* szCmdLine)
{
}
void End()
{
}
void MainLoop(HWND hWnd) // 当触发WM_DESTROY消息时,需要阻止循环
{
if (GetAsyncKeyState(VK_F1) & 0x8000)
{
DWORD newWndStyle = (WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU) & ~WS_VISIBLE;
SetWindowLong(hWnd, GWL_STYLE, newWndStyle);
RECT rcWnd = { 0, 0, 1366, 768 };
AdjustWindowRect(&rcWnd, newWndStyle, FALSE);
int x = (GetSystemMetrics(SM_CXSCREEN) - (rcWnd.right-rcWnd.left)) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - (rcWnd.bottom-rcWnd.top)) / 2;
UINT flag = 0;
SetWindowPos(hWnd, HWND_NOTOPMOST, x, y, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, flag|SWP_NOACTIVATE|SWP_SHOWWINDOW);
Sleep(500);
}
if (GetAsyncKeyState(VK_F2) & 0x8000)
{
DWORD newWndStyle = WS_OVERLAPPEDWINDOW & (~WS_MAXIMIZEBOX) & (~WS_SIZEBOX);
SetWindowLong(hWnd, GWL_STYLE, newWndStyle);
RECT rcWnd = { 0, 0, 800, 600 };
AdjustWindowRect(&rcWnd, newWndStyle, FALSE);
int x = (GetSystemMetrics(SM_CXSCREEN) - (rcWnd.right-rcWnd.left)) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - (rcWnd.bottom-rcWnd.top)) / 2;
UINT flag = 0;
SetWindowPos(hWnd, HWND_NOTOPMOST, x, y, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, flag|SWP_NOACTIVATE|SWP_SHOWWINDOW);
Sleep(500);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
}
break;
case WM_CLOSE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
// 内存泄漏检测
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
int x = 0;
int y = 0;
int width = 0;
int height = 0;
DWORD wndStyle = 0;
char szTitleName[256] = { 0 };
char szWndClass[256] = { "MainWnd" };
GetWindowCreateInfo(&x, &y, &width, &height, &wndStyle, szTitleName);
WNDCLASSEXA wndClass;
wndClass.cbSize = sizeof(wndClass);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hIcon = NULL;//LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NORMAL));
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;//MAKEINTRESOURCE(IDC_DAHUAXY2);
wndClass.lpszClassName = szWndClass;
wndClass.hIconSm = NULL;//LoadIcon(wndClass.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassExA(&wndClass);
RECT rcClient = { 0, 0, width, height };
AdjustWindowRect(&rcClient, wndStyle, FALSE);
HWND hWnd = CreateWindowExA(0,
szWndClass,
szTitleName,
wndStyle,
x, y,
rcClient.right-rcClient.left, rcClient.bottom-rcClient.top,
NULL,
NULL,
hInstance,
NULL);
Init(hWnd, lpCmdLine);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
MainLoop(hWnd);
}
End();
UnregisterClassA(szWndClass, hInstance);
return 0;
}
就这点代码,
我是win7系统,可能是系统的问题。
if (GetAsyncKeyState(VK_F2) & 0x8000)
{
RECT rcWnd = { 0, 0, 800, 600 };
SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, SWP_NOACTIVATE|SWP_NOMOVE);
DWORD newWndStyle = WS_OVERLAPPEDWINDOW & (~WS_MAXIMIZEBOX) & (~WS_SIZEBOX);
SetWindowLong(hWnd, GWL_STYLE, newWndStyle);
AdjustWindowRect(&rcWnd, newWndStyle, FALSE);
int x = (GetSystemMetrics(SM_CXSCREEN) - (rcWnd.right-rcWnd.left)) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - (rcWnd.bottom-rcWnd.top)) / 2;
UINT flag = 0;
SetWindowPos(hWnd, HWND_NOTOPMOST, x, y, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, flag|SWP_NOACTIVATE|SWP_SHOWWINDOW);
Sleep(500);
}
因为我必须要把style设置成原先的桌面模式if (GetAsyncKeyState(VK_F1) & 0x8000)
{
long Style = ::GetWindowLong(hWnd, GWL_STYLE)& ~WS_CAPTION;
//DWORD newWndStyle = (WS_POPUP | WS_MINIMIZEBOX | WS_SYSMENU) & (~WS_VISIBLE);
SetWindowLong(hWnd, GWL_STYLE, Style);
int x = GetSystemMetrics(SM_CXSCREEN) ;
int y = GetSystemMetrics(SM_CYSCREEN) ;
UINT flag = 0;
SetWindowPos(hWnd, NULL, 0, 0, x, y, NULL);
Sleep(500);
}
if (GetAsyncKeyState(VK_F2) & 0x8000)
{
DWORD newWndStyle = ::GetWindowLong(hWnd, GWL_STYLE) ^WS_CAPTION;
SetWindowLong(hWnd, GWL_STYLE, newWndStyle);
RECT rcWnd = { 0, 0, 800, 600 };
AdjustWindowRect(&rcWnd, newWndStyle, FALSE);
int x = (GetSystemMetrics(SM_CXSCREEN) - (rcWnd.right-rcWnd.left)) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - (rcWnd.bottom-rcWnd.top)) / 2;
UINT flag = 0;
SetWindowPos(hWnd, NULL, x, y, rcWnd.right-rcWnd.left, rcWnd.bottom-rcWnd.top, NULL);
Sleep(500);
}