Win32 C ++调整大小窗口在RDP中留下工件

时间:2015-08-10 22:42:36

标签: c++ windows winapi

我有一个简单的Win32程序,可执行以下操作

1)创建一个窗口

HWND hWnd = CreateWindowEx(
    WS_EX_LEFT |
    WS_EX_LTRREADING |
    WS_EX_RIGHTSCROLLBAR |
    WS_EX_WINDOWEDGE |
    WS_EX_APPWINDOW,
    wc.lpszClassName,
    L"App Name",
    WS_CAPTION |
    WS_VISIBLE |
    WS_CLIPSIBLINGS |
    WS_CLIPCHILDREN |
    WS_SYSMENU |
    WS_OVERLAPPED |
    WS_MINIMIZEBOX, 0, 0, 540, 180, 0, 0, hInstance, NULL);

然后

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{


switch (message)
{
    case WM_PAINT:
    {
        HDC hdc;
        hdc = BeginPaint(hWnd, &ps);

                    // code here (not shown) calculates pixel size of text with GetTextExtentPoint32
                    // resizes window to fit text with MoveWindow
                   MoveWindow(hWnd, rect.left, rect.top, rect.right - rect.left, height  + borderSize, false);
                    // writes text to window with DrawText

                    EndPaint(hWnd, &ps);

    }

    break;
case WM_CLOSE:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}

这在桌面上运行正常,没有问题,Window看起来很好,并按预期显示。

但是在RDP上存在以下工件:

  • 预先调整大小的Window版本仍然存在,即您可以看到旧边框和新边框
  • 将窗口创建位置的背景图像混合到窗口
  • 在屏幕周围移动窗口不会删除工件
  • 最小化窗口并再次打开它会删除工件

如果我最小化远程桌面客户端,并切换回它,则窗口将按预期显示。

其他程序在RDP会话期间不会显示此行为。

RDP客户端在Win10 x64上,目标计算机是Server 2008 R2或Windows 7 SP1 x64。

尝试在MoveWindow中将重绘设置为TRUE,但这没有任何影响。

1 个答案:

答案 0 :(得分:0)

通过从我的CreateWindowEx命令中删除WS_VISIBLE来修复此问题,首先调整Window的大小,然后在调整Window调整后调用

ShowWindow(hWnd,SW_SHOW);

我还从WM_PAINT中删除了窗口大小调整,但这并没有解决问题。