창 API 화면을 벗어난 창을 화면으로 강제 이동
5290 단어 WindowsWindowsAPI
입문
화면을 초과한 창이 응용 프로그램의 주 창 (작업 표시줄에 표시된 창) 이면 프로그램을 작성하지 않고 다음 방법으로 수동으로 돌아갈 수 있습니다.
예를 들어 아래의 사이트를 보십시오.Windows를 화면 밖으로 이동한 창을 표시 영역으로 되돌려줍니다: Tech TIPS-@IT
어떤 상황일까요?
도구상자가 다른 창에 나타날 때 사용하는 응용 프로그램입니다.또한 도구 상자의 위치는 응용 프로그램이 끝날 때 저장됩니다.자기 집에서만 이것(※ 노트북을 큰 모니터에 연결해서 사용)을 사용할 때는 좋지만, 고향에 가져가서 노트북 모니터에서만 사용할 때는 문제가 발생했습니다.
집에서 사용할 때 공구상자의 창은'노트북 모니터로 밖에 있는 곳'에서 끝나기 때문에 고향에 도착하면 그 공구상자를 사용할 수 없다.
여기서 화면 밖을 벗어난 창이 응용 프로그램의 메인 창이라면 Windows를 화면 밖으로 이동한 창을 표시 영역으로 되돌려줍니다: Tech TIPS-@IT 의 방법으로 수동으로 이동할 수 있지만 진행할 수 없습니다.
우선 이 프로그램이 설정한 파일이나 등록표를 저장하고 설정한 값을 바꾸는 것을 고려했지만 조사도 모르고 포기했다.
그런 다음 Windows API에 "열거 창"함수가 있는 것을 생각하면 오류가 발생했습니다.
도구상자가 다른 창에 나타날 때 사용하는 응용 프로그램입니다.또한 도구 상자의 위치는 응용 프로그램이 끝날 때 저장됩니다.자기 집에서만 이것(※ 노트북을 큰 모니터에 연결해서 사용)을 사용할 때는 좋지만, 고향에 가져가서 노트북 모니터에서만 사용할 때는 문제가 발생했습니다.
집에서 사용할 때 공구상자의 창은'노트북 모니터로 밖에 있는 곳'에서 끝나기 때문에 고향에 도착하면 그 공구상자를 사용할 수 없다.
여기서 화면 밖을 벗어난 창이 응용 프로그램의 메인 창이라면 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;
}
}
Reference
이 문제에 관하여(창 API 화면을 벗어난 창을 화면으로 강제 이동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/h_hiro_/items/da1aff25bba8ff0bc458
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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;
}
}
Reference
이 문제에 관하여(창 API 화면을 벗어난 창을 화면으로 강제 이동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/h_hiro_/items/da1aff25bba8ff0bc458텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)