我在线程中有一个简单的窗口,该窗口由注入(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 个函数:ShowWindow
、UpdateWindow
、RedrawWindow
,但重绘并没有像我希望的那样工作。当我使用正在注入(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/