창 API 화면을 벗어난 창을 화면으로 강제 이동

5290 단어 WindowsWindowsAPI
나는 지금 고향으로 돌아가고 있다.고향에 써 있어요.

입문


화면을 초과한 창이 응용 프로그램의 주 창 (작업 표시줄에 표시된 창) 이면 프로그램을 작성하지 않고 다음 방법으로 수동으로 돌아갈 수 있습니다.
예를 들어 아래의 사이트를 보십시오.Windows를 화면 밖으로 이동한 창을 표시 영역으로 되돌려줍니다: Tech TIPS-@IT

어떤 상황일까요?


도구상자가 다른 창에 나타날 때 사용하는 응용 프로그램입니다.또한 도구 상자의 위치는 응용 프로그램이 끝날 때 저장됩니다.자기 집에서만 이것(※ 노트북을 큰 모니터에 연결해서 사용)을 사용할 때는 좋지만, 고향에 가져가서 노트북 모니터에서만 사용할 때는 문제가 발생했습니다.
집에서 사용할 때 공구상자의 창은'노트북 모니터로 밖에 있는 곳'에서 끝나기 때문에 고향에 도착하면 그 공구상자를 사용할 수 없다.

여기서 화면 밖을 벗어난 창이 응용 프로그램의 메인 창이라면 Windows를 화면 밖으로 이동한 창을 표시 영역으로 되돌려줍니다: Tech TIPS-@IT 의 방법으로 수동으로 이동할 수 있지만 진행할 수 없습니다.
우선 이 프로그램이 설정한 파일이나 등록표를 저장하고 설정한 값을 바꾸는 것을 고려했지만 조사도 모르고 포기했다.
그런 다음 Windows API에 "열거 창"함수가 있는 것을 생각하면 오류가 발생했습니다.
  • EnumWindows 함수에서 현재 일어나고 있는 창을 순서대로 열거한다(※ 표뿐만 아니라 텍스트 상자 등 각종 구성 요소도 포함한다)
  • 창 이름 확인(이동하려는 도구상자의 제목 표시줄에 고정된 이름이 있음), 원하는 이름이 있으면 SetWindowPos 함수를 통해 이동
  • 방법이 해결되었다.

    구체적인 코드


    Visual Studio Community 2015에서 실행되었습니다.C++를 사용합니다.EnumWindows 함수의 첫 번째 변수는 C++11 표준화된 람다 공식을 사용합니다.
    #include <windows.h>
    #include <cstring>
    #include <set>
    
    const char * QUERY_WINDOW_NAME = "見つけたいウィンドウのタイトル";
    
    std::set<HWND> FoundWindows;
    // グローバルにしないとならなかった。
    // 「ローカル変数として定義して、EnumWindowsの第一引数を[]でなく[&FoundWindows]にする」
    // という方法では、EnumWindowsの部分でコンパイルエラーとなった。
    
    int main(void) {
        for (;;) {
            BOOL enumresult = EnumWindows([](HWND hwnd, LPARAM lParam) {
                // 同じウィンドウが二度現れていた場合は終了
                if (FoundWindows.count(hwnd) > 0) {
                    return FALSE;
                }
                FoundWindows.insert(hwnd);
    
                CHAR buf[100];
                GetWindowTextA(hwnd, buf, 100);
                if (std::strstr(buf, QUERY_WINDOW_NAME)) {
                    // ウィンドウサイズは変更せず(SWP_NOSIZE)、位置を(0, 0)に移動する
                    SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
                    return FALSE;
                }
                return TRUE;
            }, 0);
            if (!enumresult) break;
        }
    }
    

    좋은 웹페이지 즐겨찾기