私のプログラムは、とりわけ、コンソール ウィンドウの外観 (主にウィンドウ サイズと境界線) を変更します。
現在、私のコンピューターではすべてが完全に機能していますが、VirtualBoxまたは別のコンピューターでアプリケーションを実行すると、次のようになります。
画像の左上隅にあるウィンドウは、実際にはウィンドウではありません。クリックできないウィンドウの画像です。(マウス クリックはそれを通過します)
デスクトップ上の選択長方形をその上に伸ばすか、(たとえば) その下にあるボタンを強調表示すると、それを取り除くことができます。また、ウィンドウをその上に移動すると、ウィンドウが完全に消えます。
画像の右下隅にある黒い四角形は私のコンソール ウィンドウで、正しく表示されています。
私の質問は、C++ で「ゴースト」ウィンドウを取り除く方法ですか?
少しグーグルを試してみましたが、見つけたのはChangeDisplaySettings(0, 0);
で、これは私のコンピューターでは何もしません (おそらく私のコンピューターではこの問題が発生していないためです)。ウィンドウをフルスクリーンにしてから、元の状態に戻します。(アプリケーションを初めて実行したときに画面がちらつきます)
ゴースト ウィンドウは削除されますが、画面がそのようにちらつきたくないので、これは私が探しているものではありません。
編集:
この問題に関連するコードが何であるかを実際に把握できないため、プログラム内のウィンドウ自体の変更に関係するほとんどすべてのコードをダンプします。
CSBIEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
GetConsoleScreenBufferInfoEx(hCon, &CSBIEx);
CSBIEx.dwSize.X = 49;
CSBIEx.dwSize.Y = 21;
SetConsoleScreenBufferInfoEx(hCon, &CSBIEx);
srWnd.Bottom = 20;
srWnd.Left = 0;
srWnd.Right = 48;
srWnd.Top = 0;
SetConsoleWindowInfo(hCon, TRUE, &srWnd);
GetClientRect(hWnd, &rClnt);
rClnt.top += 1;
rClnt.bottom -= 2;
rClnt.right -= 1;
SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP);
exStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
exStyle &= ~WS_EX_CLIENTEDGE;
SetWindowLongPtr(hWnd, GWL_EXSTYLE, exStyle);
BringWindowToTop(hWnd);
SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rClnt.right / 2) - 1, (rScr.bottom / 2) - rClnt.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE);
SetWindowRgn(hWnd, CreateRectRgnIndirect(&rClnt), 1);
ShowWindow(hWnd, SW_SHOWNORMAL);
//ChangeDisplaySettings(0, 0);
2番目の編集:
それが役立つかどうかはわかりませんが、ChangeDisplaySettings(NULL, 0);
代わりに使用ChangeDisplaySettings(0, 0);
しても何も起こらないことに気付きました. NULL
それが#define
dであることを考えると、それはかなり奇妙0
です..
誰も何も理解できない場合、私はおそらくChangeDisplaySettings(0, 0);
.