Определить только окна приложений из EnumDesktopWindows - PullRequest
2 голосов
/ 23 марта 2019

Это мое самое первое приложение на C ++. У меня нет абсолютно никакого опыта в программировании приложений на C ++ или Windows, поэтому любые отзывы и помощь приветствуются. Пожалуйста, дайте мне знать, если я делаю какие-либо ошибки или не следую рекомендациям в моем коде.

Я пытаюсь написать программу на C ++, которая воспроизводит поведение WIN + D сочетание клавиш, но влияет только на окна на мониторе с помощью мыши.

Несмотря на проверку IsWindowVisible() и IsIconic(), есть некоторые системные окна, которые свернуты и развернуты, что приводит к странным сбоям, таким как:

  • Все значки на рабочем столе свернуты, и появляется серая полоса
  • Откроется пустой экземпляр Microsoft Edge
  • Приложение Windows Settings появляется из ниоткуда

Код для свертывания окон:

static std::stack<HWND> minimizedWindowPointers;
Monitors monitors;
RECT activeMonitorRect;

static BOOL CALLBACK windowEnumerator(HWND w, LPARAM l){
    if(!IsWindowVisible(w) || IsIconic(w) || getWindowTitle(w).size() == 0) return true;

    RECT r;
    GetWindowRect(w, &r);
    if(doRectsIntersect(r, activeMonitorRect)){
        SendMessage(w, WM_SYSCOMMAND, SC_MINIMIZE, 0);
        minimizedWindowPointers.push(w);
    }

    return true;
}
void minimizeWindowsOnActiveMoniter(){
    if(monitors.getRectOfMonitorWithPointer(&activeMonitorRect)) return;

    EnumDesktopWindows(NULL, windowEnumerator, NULL);

    areWindowsMinimized = true;
}
void maximizeWindowsOnActiveMoniter(){
    HWND w;
    for(int i = minimizedWindowPointers.size(); i > 0; i--){
        w = minimizedWindowPointers.top();
        minimizedWindowPointers.pop();
        if(IsIconic(w)){
            SendMessage(w, WM_SYSCOMMAND, SC_RESTORE, 0);
            std::wcout << "MAXIMIZING: " << getWindowTitle(w) << std::endl;
        }
    }

    areWindowsMinimized = false;
}

Я использую Windows 10 Pro с Visual Studio 19 Preview.

1 Ответ

3 голосов
/ 23 марта 2019

GetWindowLong может получить флажки окна с помощью GWL_STYLE.Проверьте для WS_CAPTION и WS_MINIMIZEBOX.Я также проверил бы WS_VISIBLE снова для хорошей меры.

...