WndProc () не получает сообщения, которые я ему отправил

Я сделал проект, который создает 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);

result - это S_OK (означает, что устройство успешно зарегистрировано), а windows_handle относится к тому же HWND, который я создал в Init_Window(). Например, оба имеют 0x00100a58 значений.

Теперь я изменяю какое-то свойство на своих устройствах и ожидаю получить это сообщение на моем WndProc(), но оно не работает.

WndProc() работает как-то и получает некоторые сообщения, но не те, которые мне нужны (не те, которые ему отправляют устройства).

Я уверен, что устройства отправляют сообщения (как события), потому что я могу видеть, что они делают, читая их журналы.

Например:

2013/09/25 16:46:29 HService: 44 Событие WFS_SRVE_SIU_PORT_STATUS отправлено для HWND = 330d1c hResult = WFS_SUCCESS

HWND в журнале относится к тому же HWND, который я создал в Init_Window() и windows_handle.

Кроме того, у всех вас есть то, чем я хочу заниматься. Если у вас есть другое решение, пожалуйста, укажите его.


person M.H.    schedule 25.09.2013    source источник
comment
Что делает поток, создавший окно, в свободное время? Это работает насос сообщений (см. GetMessage, DispatchMessage)? Таким образом сообщения доставляются оконной процедуре.   -  person Igor Tandetnik    schedule 25.09.2013


Ответы (1)


Я нашел решение благодаря уважаемому Игорю Тандетнику

Все, что мне нужно было сделать, это добавить 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()
    }
} 
person M.H.    schedule 28.09.2013