2013-09-25 85 views
0

我做了一個項目,創建了一個DLL。該項目使用WFS方法,他們訪問某些硬件(設備)以獲取信息或執行某些命令。WndProc()沒有收到我發送給它的消息

在我的項目中,我首先打開這些設備然後註冊它們,之後我使用其他方法獲取信息或執行。

HRESULT extern WINAPI WFSOpen (LPSTR lpszLogicalName, HAPP hApp, LPSTR lpszAppID, DWORD dwTraceLevel, DWORD dwTimeOut, DWORD dwSrvcVersionsRequired, LPWFSVERSION lpSrvcVersion, LPWFSVERSION lpSPIVersion, LPHSERVICE lphService); 

HRESULT extern WINAPI WFSRegister (HSERVICE hService, DWORD dwEventClass, HWND hWndReg); 

正如你所看到的,WFSRegister需要HWND作爲參數。 WFSRegister使用此參數向其發送事件或消息。

我的項目不是MFC項目,我沒有窗戶。我決定創建一個窗口並將正確的HWND分配給WFSRegister。我還創建了WndProc以獲取WFS方法稍後將發送給我的消息。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
    case WFS_EXECUTE_EVENT: 
     cout<<"WFS_EXECUTE_EVENT"; 
     break; 
    case WFS_SERVICE_EVENT: 
     cout<<"WFS_EXECUTE_EVENT"; 
     break; 
    case WFS_USER_EVENT: 
     cout<<"WFS_USER_EVENT"; 
     break; 
    case WFS_SYSTEM_EVENT: 
     cout<<"WFS_SYSTEM_EVENT"; 
     break; 
    } 

    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

void Init_Window() 
{ 
    WNDCLASS Wclass; 
    Wclass.hInstance = gHinstance; 
    Wclass.cbClsExtra = 0; 
    Wclass.cbWndExtra = 0; 
    Wclass.lpszClassName = TEXT("Device_Manager_Class_Name"); 
    Wclass.lpszMenuName = NULL; 
    Wclass.lpfnWndProc = WndProc; 
    Wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 
    Wclass.hCursor = LoadIcon(NULL, IDC_ARROW); 
    Wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    Wclass.style = CS_OWNDC; 


    if(!RegisterClass(&Wclass)) 
    { 
     cout<<"Unable to Register Class"; 
    } 

    ULONG Window_Width; 
    ULONG Window_Height; 
    DWORD style; 

    Window_Width = SCREEN_WIDTH; 
    Window_Height = SCREEN_HEIGHT; 
    style = WS_OVERLAPPED|WS_SYSMENU; 

    gHwnd = CreateWindow(TEXT("Device_Manager_Class_Name") 
     , TEXT("Device_Manager_Class_Title")     
     , style    
     , 0 
     , 0 
     , Window_Width 
     , Window_Height 
     , GetDesktopWindow() 
     , NULL 
     , gHinstance 
     , NULL); 

    if(!gHwnd){ 
     cout<<"Unable to create the main window"; 
    } 

    ShowWindow(gHwnd, SW_SHOW); 
    UpdateWindow(gHwnd); 
    SetFocus(gHwnd); 

} 

Init_Window()成功創建窗口,我在這裏沒有概率。

當我想註冊我的設備,我叫下面的代碼,以獲得正確的HWND

HWND windows_handle = FindWindow(TEXT("Device_Manager_Class_Name"), 0); 

HRESULT result = WFSRegister(wfsRes.hService, WFS_EXECUTE_EVENT || WFS_SERVICE_EVENT || WFS_USER_EVENT || WFS_SYSTEM_EVENT , windows_handle); 

resultS_OK(意味着成功註冊了設備)和windows_handle指的是我創造了同樣的HWNDInit_Window()。例如,兩者都有0x00100a58的值。

現在我改變了我的設備上的一些屬性,我希望得到這些消息在我的WndProc(),但它不起作用。

WndProc()以某種方式工作並獲取一些消息,但不是我想要的消息(不是那些設備發送給它的消息)。

我確定設備發送消息(作爲事件),因爲我可以通過閱讀它們的日誌來看到它們。

例如:

2013年9月25日16時46分29秒HService:44事件WFS_SRVE_SIU_PORT_STATUS在日誌中發送用於HWND = 330d1c HRESULT = WFS_SUCCESS

HWND指相同HWND我在Init_Window()windows_handle創建。

此外,你都得到了我想要做的。如果您有任何其他解決方案,請隨時提及。

+1

什麼是創建該窗口在其空閒時間做的線程?它運行一個消息泵(參見'GetMessage','DispatchMessage')?這就是消息如何傳遞給窗口過程。 –

回答

1

我找到解決方案感謝親愛伊戈爾Tandetnik

所有我需要做的就是添加GetMessage()

MSG msg; 
BOOL bRet; 
HWND windows_handle = FindWindow(TEXT("Device_Manager_Class_Name"), 0); 
while((bRet = GetMessage(&msg, windows_handle, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 
    } 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); //<< This line send msg to WndProc() 
    } 
} 
相關問題