我编写了一个小程序,当按下WIN + ALT + ARROW时, Windows 中的前景窗口将调整为列视图中的三个位置之一。我使用SetWindowPos()
执行此操作。但是,对于某些类型的窗口,SetWindowPos()
不会将窗口设置为指定的完整大小。程序周围有一个小的空边框空间。
我测试的程序导致了这个问题:console programs
,Windows File Explorer
。
我测试的那些不会导致此问题:VS2015
,Google Chrome
。
源代码:
#include <math.h>
#include <mutex>
#include <condition_variable>>
#include <Windows.h>
#include <WinUser.h>
#define KeyState(key) ((GetAsyncKeyState(key) & 0x8000) == 0x8000)
void SetWindow(HWND active_window, LONG xx, LONG top, LONG ww, LONG size) {
SetWindowPos(active_window, NULL, xx, top, ww, size, SWP_SHOWWINDOW);
}
void process_keyboardInput(bool &pr_up, bool &pr_left, bool &pr_right) {
if ((KeyState(VK_LWIN) || KeyState(VK_RWIN)) && KeyState(VK_MENU)) {
WINDOWINFO window;
HWND active_window = GetForegroundWindow();
GetWindowInfo(active_window, &window);
if ((window.dwStyle & WS_SIZEBOX) != WS_SIZEBOX)
return;
RECT prc;
GetWindowRect(active_window, &prc);
HMONITOR monitor = MonitorFromWindow(active_window, MONITOR_DEFAULTTONEAREST);
MONITORINFO info;
info.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(monitor, &info);
LONG left = info.rcMonitor.left,
right = info.rcMonitor.right,
xx = 0, ww = 0, state = 0x0;
FLOAT size = right - left, win_height = (prc.bottom - prc.top) / 2, win_width = (prc.right - prc.left) / 2;
if (!KeyState(VK_UP))
pr_up = false;
if (!KeyState(VK_LEFT))
pr_left = false;
if (!KeyState(VK_RIGHT))
pr_right = false;
if (KeyState(VK_LEFT) && KeyState(VK_UP) && !(pr_left && pr_up) && !pr_right) {
ww = (LONG)(floor(size / 3.0F) + round(size / 3.0F));
xx = info.rcMonitor.left;
pr_left = true;
pr_up = true;
size = info.rcWork.bottom - info.rcWork.top;
SetWindowPos(active_window, NULL, xx, info.rcMonitor.top, ww, size, SWP_SHOWWINDOW);
}
if (KeyState(VK_RIGHT) && KeyState(VK_UP) && !(pr_right && pr_up) && !pr_left) {
ww = (LONG)(ceil(size / 3.0F) + round(size / 3.0F));
xx = info.rcMonitor.left + (size - ww);
pr_right = true;
pr_up = true;
size = info.rcWork.bottom - info.rcWork.top;
SetWindowPos(active_window, NULL, xx, info.rcMonitor.top, ww, size, SWP_SHOWWINDOW);
}
if (KeyState(VK_LEFT) && !pr_left && !pr_up && !pr_right) {
ww = (LONG)floor(size / 3.0F);
xx = info.rcMonitor.left;
pr_left = true;
size = info.rcWork.bottom - info.rcWork.top;
SetWindowPos(active_window, NULL, xx, info.rcMonitor.top, ww, size, SWP_SHOWWINDOW);
}
if (KeyState(VK_RIGHT) && !pr_right && !pr_up && !pr_left) {
ww = (LONG)ceil(size / 3.0F);
xx = info.rcMonitor.left + (size - ww);
pr_right = true;
size = info.rcWork.bottom - info.rcWork.top;
SetWindowPos(active_window, NULL, xx, info.rcMonitor.top, ww, size, SWP_SHOWWINDOW);
}
if (KeyState(VK_UP) && !pr_up && !pr_left && !pr_right) {
ww = (LONG)round(size / 3.0F);
xx = info.rcMonitor.left + ww;
pr_up = true;
size = info.rcWork.bottom - info.rcWork.top;
SetWindowPos(active_window, NULL, xx, info.rcMonitor.top, ww, size, SWP_SHOWWINDOW);
}
}
}
int main() {
HWND hWnd = GetConsoleWindow();
ShowWindow(hWnd, SW_HIDE);
while (true) {
process_keyboardInput(pr_up, pr_left, pr_right);
Sleep(10);
}
return 0;
}
如果有人感兴趣,那么这是一个副作用:task manager
似乎根本没有提示我的任何代码,忽略了所有内容。