Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: aekhv от Октябрь 24, 2020, 12:07



Название: WinAPI MoveWindow не работает в Win 10
Отправлено: aekhv от Октябрь 24, 2020, 12:07
Здравствуйте.

Почему-то в Win 10 не работает MoveWindow(), пробовал на нескольких дистрибутивах. В Win 7 всё работает прекрасно. В чём может быть причина?

Простейший пример, который двигает окна, в заголовке которых есть слово "Блокнот", прилагаю.
Код:
#include <QCoreApplication>
#include <windows.h>

QString getWindowTitle(HWND hWindow)
{
    wchar_t wtitle[1024];
    int len = GetWindowText(hWindow, LPWSTR(wtitle), sizeof (wtitle) - sizeof (wchar_t));

    if (len <= 0)
        return QString();
    else
        return QString::fromWCharArray(wtitle);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    HWND hRoot = GetDesktopWindow();
    HWND hWindow = GetWindow(hRoot, GW_CHILD);

    int i = 25;
    while (hWindow != nullptr)
    {
        QString win_title = getWindowTitle(hWindow);

        if (win_title.contains("Блокнот")) {
            MoveWindow(hWindow, i, i, 500, 400, true);
            i += 25;
        }

        hWindow = GetWindow(hWindow, GW_HWNDNEXT);
    }

    //    return a.exec();
}

(https://i114.fastpic.ru/big/2020/1024/b6/47f2218bf6bbe096f25c317be45460b6.png)


Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: tux от Октябрь 24, 2020, 13:01
Так а что вы хочете? Только что проверил - всё работает, в соответсвии с кодом.
Запустил 2 блокнота - всё нашлось и выстроилось "лесенкой". Может вы просто хотели не то, что написано в коде?


Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: aekhv от Октябрь 24, 2020, 13:14
Я хочу чтобы окошки двигались :) Мой пример упорно не работает в Win 10, GetLastError() сразу после MoveWindow() возвращает 0, а окна не двигаются. Не могу понять куда смотреть, где искать ошибку. Тот же самый код в Windows 7 работает.


Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: tux от Октябрь 24, 2020, 13:21
Я хочу чтобы окошки двигались :) Мой пример упорно не работает в Win 10, GetLastError() сразу после MoveWindow() возвращает 0, а окна не двигаются. Не могу понять куда смотреть, где искать ошибку. Тот же самый код в Windows 7 работает.
В семерке тот же самый код работает точно так-же, как и в 10. Тоже только что проверил, даже качнуля для этого итальянскую 7-ку. :)
С чего они будут двигаться то? Вы находите 1 окно с таким заголовком, двигаете его на 1 позицию, затем находите следующее окно и его двигаете, уже на новую позицию. Всё, как задумывалось в коде.


Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: aekhv от Октябрь 24, 2020, 13:28
Вы находите 1 окно с таким заголовком, двигаете его на 1 позицию, затем находите следующее окно и его двигаете, уже на новую позицию. Всё, как задумывалось в коде.

Я прекрасно понимаю как оно работает ;) Собственно, я просто набросал рабочий пример, чтобы проиллюстрировать то, что у меня не работает в основном проекте. Я понимаю, что ситуация банальная. Всё, на первый взгляд, проще простого и должно работать. Но вот не работает у меня, и именно в Windows 10. Окно не перемещается в заданную позицию, и никаких ошибок нет.


Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: qate от Октябрь 25, 2020, 13:08
делай готовый рабочий пример, со всеми выводами getlasterror, с указанием версии qt
проверь на чистой венде в виртуалке



Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: tux от Октябрь 25, 2020, 14:42
Окно не перемещается в заданную позицию, и никаких ошибок нет.
Всё работает. Одинаково. И на 10 и на 7. Тем более, что там нет никаких неоднозначностей в коде, чтобы не работало.
Ищите ошибки в своём коде. Либо приведите другой пример подобного "бага".
Я не издеваюсь, мне просто интересны такие особенности. Мало ли, вдруг у клиента всплывут. Допустим, с разным поведением одного и того же класса в 7 и 10 я уже видел. На тот момент решил костылём.


Название: Re: WinAPI MoveWindow не работает в Win 10
Отправлено: aekhv от Октябрь 26, 2020, 13:41
Господа, уж просите меня, мне так стыдно! Пример я наваял поторопившись, а как раз-таки с блокнотом всё хорошо работает. Не работает с другим софтом. Кому интересно, вот c этим реально НЕ работает: https:// www .acelab. ru /dep.pc/download/PC3000DiskAnalyzer.zip

И проблему я решил, надо было запускать exe от имени администратора. Добавил с сборку манифест и теперь всё хорошо. Вероятно, чтобы двигать чужие окна, запущенные от имени админа, нужно самому иметь права админа.