Windows: координата окна X не точная - PullRequest
0 голосов
/ 13 июня 2019

Я хочу получить (точные) экранные X и Y координаты окна ( клиентская область ).Моя проблема в том, что мне нужно определить горизонтальный сдвиг, который нужно добавить к координате X, чтобы получить правильный результат:

#include <windows.h>

inline int get_title_bar_thickness(const HWND window_handle)
{
    RECT window_rectangle, client_rectangle;
    GetWindowRect(window_handle, &window_rectangle);
    GetClientRect(window_handle, &client_rectangle);
    const int height = window_rectangle.bottom - window_rectangle.top -
        (client_rectangle.bottom - client_rectangle.top);
    const int width = window_rectangle.right - window_rectangle.left -
        (client_rectangle.right - client_rectangle.left);
    return height - width / 2;
}

#define HORIZONTAL_SHIFT 8

/**
 * Gets the window position of the window handle
 * excluding the title bar and populates the x and y coordinates
 */
inline void get_window_position(const HWND window_handle, int* x, int* y)
{
    RECT rectangle;
    const auto window_rectangle = GetWindowRect(window_handle, &rectangle);
    const auto title_bar_thickness = get_title_bar_thickness(window_handle);
    if (window_rectangle)
    {
        *x = rectangle.left + HORIZONTAL_SHIFT;
        *y = rectangle.top + title_bar_thickness;
    }
}

Проблема может быть обнаружена путем программного перемещения окна:

const auto window_handle = FindWindow(nullptr, "Command Prompt");
SetWindowPos(window_handle, nullptr, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

Я ожидаю, что этот вызов SetWindowPos() идеально поместит окно в верхний левый угол моего экрана, но между окном и границей экрана остается некоторое пространство (ровно 8 пикселей).Есть ли способ убедиться, что это горизонтальное смещение учитывается автоматически?Это может быть связано с ноутбуками, так как сделать так, чтобы он вел себя так, как ожидалось?

1 Ответ

2 голосов
/ 13 июня 2019

Как прокомментировано Castorix, горизонтальный сдвиг может быть восстановлен.

#include <dwmapi.h>

#pragma comment(lib, "dwmapi.lib")

inline int get_horizontal_shift(const HWND window_handle)
{
    RECT window_rectangle, frame_rectangle;
    GetWindowRect(window_handle, &window_rectangle);
    DwmGetWindowAttribute(window_handle,
                         DWMWA_EXTENDED_FRAME_BOUNDS, &frame_rectangle, sizeof(RECT));

    return frame_rectangle.left - window_rectangle.left;
}

Код основан на этой записи.Возвращаемое значение 7 на моей машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...