0

我在我的应用程序中创建了一个窗口和一个线程。现在我希望线程处理一些数据并将其显示在主窗口上。为此,我在我的线程中使用了 PostMessage() 函数。即创建一个窗口,然后创建一个线程。该线程对数据进行一些处理,并向主窗口发布一条消息,表明现在应该显示数据。但问题是,为了这个目的,我必须传递窗口的句柄,而对于这个线程,主窗口句柄是一个未声明的标识符。是否有任何可能的方法可以将主窗口的句柄传递给我的线程,以便使用这个句柄,线程能够发布消息。以下是任何帮助的代码片段:

///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;
}
4

1 回答 1

7
DWORD WINAPI threadFunction(LPVOID param)
{   
     HANDLE hwnd = (HANDLE)param;
}

...

HANDLE threadHandle = CreateThread(NULL,
                                  0,
                                  threadFunction,
                                  (LPVOID)hMainWin,
                                  0,
                                  &threadID);

线程函数有LPVOID类型,它匹配HANDLE类型,在 Win32 和 x64 中。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

顺便说一句,您需要将消息循环添加到 WinMain。

于 2013-03-20T07:52:13.713 回答