C++ WndProc()没有收到我发送给它的消息
我做了一个创建C++ WndProc()没有收到我发送给它的消息,c++,visual-c++,wndproc,hwnd,C++,Visual C++,Wndproc,Hwnd,我做了一个创建DLL的项目。该项目使用WFS方法,它们访问一些硬件(设备)以获取信息或执行一些命令 在我的项目中,我首先打开这些设备,然后注册它们,然后使用其他方法获取信息或执行 HRESULT extern WINAPI WFSOpen ( LPSTR lpszLogicalName, HAPP hApp, LPSTR lpszAppID, DWORD dwTraceLevel, DWORD dwTimeOut, DWORD dwSrvcVersionsRequired, LPWFSVERSI
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项目,我没有windows。我决定创建一个窗口,并将正确的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);
}
result
是S\u OK
(表示设备注册成功),并且windows\u handle
引用了我在Init\u Window()中创建的相同HWND
。例如,两者都具有0x00100a58
值
现在我更改了设备上的一些属性,我希望在我的WndProc()
上获得这些消息,但它不起作用
WndProc()
以某种方式工作并获得一些消息,但不是我想要的消息(不是设备发送给它的消息)
我确信这些设备会发送消息(作为事件),因为我可以通过读取它们的日志看到它们所做的事情
例如:
2013/09/25 16:46:29 hs服务:44事件WFS\u SRVE\u SIU\u PORT\u状态发送至HWND=330d1c hResult=WFS\u成功
日志中的HWND
引用了我在Init_Window()
和windows_句柄中创建的相同HWND
还有,你们都知道我想做什么。如果您有任何其他解决方案,请随时提及。我找到了解决方案,这要感谢亲爱的Igor Tandetnik
我只需要添加GetMessage()
MSG;
布尔布雷特;
HWND windows\u handle=FindWindow(文本(“设备管理器\u类\u名称”),0;
while((bRet=GetMessage(&msg,windows_handle,0,0))!=0)
{
如果(bRet==-1)
{
//处理错误并可能退出
}
其他的
{
翻译信息(&msg);
DispatchMessage(&msg);//创建窗口的线程在空闲时间做什么?它运行消息泵(请参见GetMessage
,DispatchMessage
)?这就是消息传递到窗口过程的方式。
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);
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()
}
}