SetWindowPos没有将窗口设置为正确的大小

时间:2017-03-11 20:25:14

标签: c++ windows winapi

我编写了一个小程序,当按下WIN + ALT + ARROW时, Windows 中的前景窗口将调整为列视图中的三个位置之一。我使用SetWindowPos()执行此操作。但是,对于某些类型的窗口,SetWindowPos()不会将窗口设置为指定的完整大小。程序周围有一个小的空边框空间。

我测试的程序导致了这个问题:console programsWindows File Explorer

我测试的那些不会导致此问题:VS2015Google 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似乎根本没有提示我的任何代码,忽略了所有内容。

0 个答案:

没有答案