我在我的应用程序中创建了一个Window和一个Thread。现在我希望线程处理一些数据并将其显示在主窗口上。 为此,我在我的线程中使用了PostMessage()函数。 即创建一个窗口,然后创建一个Thread。该线程对数据应用了一些处理,并将消息发布到主窗口,现在应该显示数据。 但问题是,为此目的,我将不得不传递Window的Handle,而对于这个线程,Main Window Handle是一个未声明的IDENTIFIER。 有没有可能的方法,我可以将主窗口的句柄传递给我的线程,以便使用此句柄,线程能够发布消息。 以下是任何帮助的代码段:
///Thread Function////
DWORD WINAPI threadFunction(LPVOID param)
{
//do something
PostMessage(hMainWin, WM_thread,0, 0);
return true;
}
////Main Function///
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
const char AH_Glb_ClassName[] = "myWindClass";
WNDCLASSEX wc;
MSG Msg;
//Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = AH_Glb_ClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
HWND hMainWin; //Handle to Main WIndow
///Creating Main Window///
hMainWin = CreateWindowEx( WS_EX_CLIENTEDGE,
AH_Glb_ClassName,
"I am SERVER Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
440,
120,
NULL, NULL, NULL, NULL);
if(hMainWin == NULL)
{
MessageBox(NULL,
"Window Creation Failed!",
"Error!",
MB_ICONEXCLAMATION |
MB_OK);
return 0;
}
ShowWindow(hMainWin,SW_MAXIMIZE);
UpdateWindow(hMainWin);
/////////////////THREAD////////////////
DWORD threadID = 0;
///Creating Thread///
HANDLE threadHandle = CreateThread(NULL,
0,
threadFunction,
0,
0,
&threadID);
return 0;
}
答案 0 :(得分:7)
DWORD WINAPI threadFunction(LPVOID param)
{
HANDLE hwnd = (HANDLE)param;
}
...
HANDLE threadHandle = CreateThread(NULL,
0,
threadFunction,
(LPVOID)hMainWin,
0,
&threadID);
线程函数具有LPVOID
类型,它与Win32和x64中的HANDLE
类型匹配。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx
顺便说一句,你需要为WinMain添加消息循环。