C ++ WINAPI窗口不刷新

时间:2016-04-22 13:23:56

标签: c++ winapi

我在一个由注入的DLL创建的线程中有一个简单的窗口。这就是我的线程的样子:

int Thread()
{
  HWND hwnd;
  MSG messages;
  WNDCLASSEX wincl;
  /* The Window structure */
  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.style = CS_CLASSDC;
  wincl.cbSize = sizeof(WNDCLASSEX);
  wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  wincl.lpszMenuName = NULL;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;

  wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
  if (!RegisterClassEx(&wincl))
    ;

  hwnd = CreateWindowEx(
    0,
    szClassName,
    "Windows App",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    544,
    375,
    NULL,
    NULL,
    hThisInstance,
    NULL
    );
  ShowWindow(hwnd, SW_SHOW);

  while (true) {
    if (GetMessage(&messages, NULL, 0, 0)) {
      TranslateMessage(&messages);
      DispatchMessage(&messages);
    }
    SetWindowText(hwnd, b);
    ShowWindow(hwnd, SW_SHOW);

    UpdateWindow(hwnd);
    RedrawWindow(hwnd, NULL, NULL, RDW_UPDATENOW);

    //do the stuff that computes values to show
  }
  return 0;
}

这是我的窗口程序:

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
  case WM_PAINT:
  {

    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    TextOut(hdc,
      10,
      10,
      b,
      50);
    EndPaint(hwnd, &ps);
    return 0L;
  }
  break;
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    return DefWindowProc(hwnd, message, wParam, lParam);
  }
  return 0;
}

窗口有效,但存在一个主要问题。我想要实时更新和显示值,无论是在标题栏还是在窗口内。尽管在循环中使用了这三个函数:ShowWindowUpdateWindowRedrawWindow,重绘不会按照我希望的方式工作。当我正在使用正在注入的应用程序并生成我希望在我创建的窗口中显示的值时,我的窗口的标题栏或主区域都不会更新。但是当所需的值发生变化并且我将鼠标移到窗口上时,标题栏会更新。至于主要区域,它只在我将窗口拖到屏幕边缘时更新,以便我覆盖要显示文本的位置然后将其揭开(它甚至可以部分重绘),或者只是最小化和恢复窗户。

2 个答案:

答案 0 :(得分:1)

InvalidateRect之前致电UpdateWindow

答案 1 :(得分:1)

 if (GetMessage(&messages, NULL, 0, 0)) {
   TranslateMessage(&messages);
   DispatchMessage(&messages);
 }
 SetWindowText(hwnd, b);
 ShowWindow(hwnd, SW_SHOW);

 UpdateWindow(hwnd);
 RedrawWindow(hwnd, NULL, NULL, RDW_UPDATENOW);

GetMessage 阻止如果没有要处理的消息。 您应该确保它有要处理的消息,可能使用SetTimer来计算定时器消息,或者查看使用PeekMessage而不是GetMessage(使用PM_REMOVE标志)