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,

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

0

Решение

Я нашел решение благодаря дорогой Игорь Тандетник

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]