2013-09-25 41 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() 
    } 
} 
相关问题