将窗口句柄传递给C中的线程(WIN32 API)

时间:2013-03-20 07:40:26

标签: c windows multithreading winapi

我在我的应用程序中创建了一个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;
}

1 个答案:

答案 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添加消息循环。