【发布时间】:2016-04-22 13:23:55
【问题描述】:
我在由注入的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,但重绘并不能如我所愿。当我使用正在注入的应用程序并生成我希望在我创建的窗口中显示的值时,我的窗口的标题栏或主区域都不会更新。但是,当所需的值发生变化并且我将鼠标移到我的窗口上时,标题栏会更新。至于主要区域,它仅在我将窗口拖动到屏幕边缘时更新,以便我覆盖要显示文本的位置然后揭开它(它甚至可以部分重绘),或者只是最小化并恢复窗户。
【问题讨论】: