C ++:出现一个徘徊的'鬼'窗口..?

时间:2012-11-27 14:32:32

标签: c++ windows winapi user-interface console

我的程序 - 除其他外 - 改变了控制台窗口的外观(主要是窗口大小和边框) 现在在我的计算机上,此刻一切正常,但是当我在 VirtualBox 不同的计算机上运行应用程序时,我得到以下内容:

what is happening

图像左上角的窗口实际上不是窗口。它是一个窗口的图像,您无法点击。 (点击鼠标点击它)
你可以通过拉伸桌面上的选择矩形来消除它,或者如果你突出显示(例如)它下面的按钮。此外,您可以在其上移动一个窗口,使其完全消失。

图像右下角的黑色矩形是我的控制台窗口,可以正确显示。

我的问题是,如何摆脱鬼魂'用C ++编写的窗口?
我尝试了谷歌搜索,但我能找到的只是ChangeDisplaySettings(0, 0);,这在我的电脑上没有做任何事情(可能是因为我甚至没有在我的电脑上出现这个问题),而且在VirtualBox中,它首先似乎暂时使控制台窗口全屏,然后回到它的方式。 (第一次运行应用程序时屏幕闪烁)
虽然它确实删除了鬼窗口,但我不希望屏幕像这样闪烁,所以这不是我想要的。

编辑:
由于我无法弄清楚这个问题的相关代码是什么,所以我只会转储与我的程序中更改窗口本身有关的所有代码。

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);

2ND编辑:
我不知道它是否有任何帮助,但我注意到,如果我使用ChangeDisplaySettings(NULL, 0);代替ChangeDisplaySettings(0, 0);,它就不会做任何事情。考虑到NULL#define d 0,这很奇怪。 如果没有人可以解决任何问题,我可能最终会使用ChangeDisplaySettings(0, 0);

2 个答案:

答案 0 :(得分:2)

InvalidateRect(NULL, NULL, TRUE);

是我要找的东西。

答案 1 :(得分:0)

您是否在计算机上运行“Aero”主题?如果是这样,请切换到经典主题。 Betcha你会看到问题表现出来。我认为你的应用程序没有正确处理WM_PAINT消息。 Aero主题发送的WM_PAINT消息少得多。操作系统使用它保存的位图进行绘画。

编辑:尝试使用新维度调用这些:

BOOL WINAPI SetConsoleDisplayMode(
    _In_       HANDLE hConsoleOutput,
    _In_       DWORD dwFlags,
    _Out_opt_  PCOORD lpNewScreenBufferDimensions
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033%28v=vs.85%29.aspx

BOOL WINAPI SetConsoleWindowInfo(
  _In_  HANDLE hConsoleOutput,
  _In_  BOOL bAbsolute,
  _In_  const SMALL_RECT *lpConsoleWindow
);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686125%28v=vs.85%29.aspx

您也可以尝试使用DispatchMessage向自己发送WM_PAINT消息。