c++ - WndProc() 没有收到我发送给它的消息

标签 c++ visual-c++ wndproc hwnd

我创建了一个创建DLL 的项目。该项目使用WFS方法,它们访问一些硬件(设备)以获取信息或执行一些命令。

在我的项目中,我首先打开这些设备然后注册它们,然后我使用其他方法获取信息或执行。

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/09/25 16:46:29 HService : 44 Event WFS_SRVE_SIU_PORT_STATUS Sent for HWND = 330d1c hResult = WFS_SUCCESS

日志中的

HWND 指的是我在 Init_Window()windows_handle 中创建的相同 HWND

此外,你们都得到了我想做的事情。如果您有任何其他解决方案,请随时提及。

最佳答案

感谢亲爱的 Igor 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()
    }
} 

关于c++ - WndProc() 没有收到我发送给它的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19006857/

相关文章:

c# - 如何在 C# 中捕获 Lua 异常

c++ - 如何正确处理来自 MSFTEDIT_CLASS (RichEdit) 控件的 Windows 消息?

vb.net - WndProc WM_NCMOUSEUP 不火

c++ - 编译器误区

c++ - 数组和函数

c++ - DosBox 中的 vector 头文件

c++ - 窗体头文件中的 "error C2653: System is not a class or a namespace name",Visual C++

visual-c++ - 如何将夹具添加到 PropertySheet?

c++ - libev + 非阻塞socket 持续调用回调

c++ - 为什么使用给定一个线程的 OpenMP schedule(dynamic) 并行化循环中的所有迭代? (MSVS 2010)