C++ WINAPI 窗口不刷新

标签 c++ winapi

我在线程中有一个简单的窗口,该窗口由注入(inject)的 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;
}

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

最佳答案

 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 blocks 如果没有要处理的消息。 您应该确保它有消息要处理,也许通过使用 SetTimer 来生成计时器消息,或者考虑使用 PeekMessage 而不是 GetMessage(使用 PM_REMOVE 标志)

关于C++ WINAPI 窗口不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36795092/

相关文章:

winapi - 如何检测给定 exe 上使用的 PE 打包程序是什么?

windows - 在 Go 中调用 SHGetImageList

delphi - 如何在Delphi中正确使用IFileOperation删除文件夹中的文件

c++ - 书中的代码未运行 - 旧语法或错误代码?

c++ - 为 < 函数的运算符获取 undefined reference

c++ - 派生类成员由基类构造函数初始化

c++ - C/C++ PCM开源音频分析仪

c++ - C++ 中是否有实际的 8 位整数数据类型

c++ - 为什么 GetServiceDisplayNameW() 和 GetServiceDisplayNameA() 在字符中返回不同的所需缓冲区大小?

c - 无法将多行文本文件复制到缓冲区