我做了一個項目,創建了一個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);
result
是S_OK
(意味着成功註冊了設備)和windows_handle
指的是我創造了同樣的HWND
Init_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
創建。
此外,你都得到了我想要做的。如果您有任何其他解決方案,請隨時提及。
什麼是創建該窗口在其空閒時間做的線程?它運行一個消息泵(參見'GetMessage','DispatchMessage')?這就是消息如何傳遞給窗口過程。 –