Yup, HWND_TOPMOST
làm điều đó cho tôi. Đây là một phần của mã mà làm cho toàn màn hình cũng làm việc (và nhanh) cho tôi:
bool enterFullscreen(HWND hwnd, int fullscreenWidth, int fullscreenHeight, int colourBits, int refreshRate) {
DEVMODE fullscreenSettings;
bool isChangeSuccessful;
RECT windowBoundary;
EnumDisplaySettings(NULL, 0, &fullscreenSettings);
fullscreenSettings.dmPelsWidth = fullscreenWidth;
fullscreenSettings.dmPelsHeight = fullscreenHeight;
fullscreenSettings.dmBitsPerPel = colourBits;
fullscreenSettings.dmDisplayFrequency = refreshRate;
fullscreenSettings.dmFields = DM_PELSWIDTH |
DM_PELSHEIGHT |
DM_BITSPERPEL |
DM_DISPLAYFREQUENCY;
SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST);
SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, fullscreenWidth, fullscreenHeight, SWP_SHOWWINDOW);
isChangeSuccessful = ChangeDisplaySettings(&fullscreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL;
ShowWindow(hwnd, SW_MAXIMIZE);
return isChangeSuccessful;
}
Lưu ý rằng điều này sẽ thay đổi độ phân giải nếu bạn nói với nó các thiết lập sai. Đây là những gì tôi thường muốn, nhưng nếu bạn không thích điều đó, bạn có thể tìm hiểu độ phân giải của bạn bằng cách sử dụng (trong đó mainWindow
được trả về từ một cái gì đó giống như CreateWindow()
hoặc CreateWindowEx()
):
windowHDC = GetDC(mainWindow);
fullscreenWidth = GetDeviceCaps(windowHDC, HORZRES);
fullscreenHeight = GetDeviceCaps(windowHDC, VERTRES);
colourBits = GetDeviceCaps(windowHDC, BITSPIXEL);
refreshRate = GetDeviceCaps(windowHDC, VREFRESH);
Khi bạn muốn thoát ra khỏi của toàn màn hình bạn làm điều gì đó như thế này:
bool exitFullscreen(HWND hwnd, int windowW, int windowY, int windowedWidth, int windowedHeight, int windowedPaddingX, int windowedPaddingY) {
bool isChangeSuccessful;
SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_LEFT);
SetWindowLongPtr(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
isChangeSuccessful = ChangeDisplaySettings(NULL, CDS_RESET) == DISP_CHANGE_SUCCESSFUL;
SetWindowPos(hwnd, HWND_NOTOPMOST, windowX, windowY, windowedWidth + windowedPaddingX, windowedHeight + windowedPaddingY, SWP_SHOWWINDOW);
ShowWindow(hwnd, SW_RESTORE);
return isChangeSuccessful;
}
tôi đặt mã của tôi để thay đổi giữa độ toàn màn hình và chế độ cửa sổ bằng cách sử dụng phím nóng, và tôi giữ các biến chế độ cửa sổ như toàn cầu, do đó khi chuyển sang cửa sổ chế độ, nó vẫn đặt.
Mã này cũng có lợi thế là chạy tương đương với "chế độ độc quyền" (tôi đang sử dụng XP và chưa thử trên các phiên bản cửa sổ mới hơn), điều đó có nghĩa là nó sẽ nhiều, nhiều nhanh hơn. Hãy cho tôi biết nếu tôi đã thực hiện bất kỳ sai lầm nào từ việc ngưng tụ mã (từ mã lớn hơn của tôi).
-1 vì bạn không nên gây rối với thanh tác vụ; nó không cần thiết ở nơi đầu tiên; xem blog của Raymond Chen về điều này ở đây: [Làm cách nào để che thanh tác vụ bằng cửa sổ toàn màn hình?] (http://blogs.msdn.com/b/oldnewthing/archive/2005/05/05/414910.aspx) – BrendanMcK
@ BrendanMcK: Tôi đã chỉnh sửa câu trả lời của mình. Chúc bạn ngày mới tốt lành. –
Tuyệt vời, -1 được chuyển đổi thành +1. (Thực ra tôi hơi quá nhanh với điều đó -1 ngay từ đầu, tôi nên để lại lời bình trước. Tôi nghĩ mình đã trở nên quá nhạy cảm khi nhìn thấy cửa sổ hack trong nhiều năm -!) – BrendanMcK