从运行服务的应用程序代码中提取窗口句柄 我正在编写一个Win32 C++接口,用于连接生物测量设备。制造商提供的SDK使用MFC。我没有MFC方面的经验或知识
平台:视窗10 架构:x64 工具链:MSVC 2017从运行服务的应用程序代码中提取窗口句柄 我正在编写一个Win32 C++接口,用于连接生物测量设备。制造商提供的SDK使用MFC。我没有MFC方面的经验或知识,c++,windows,winapi,service,mfc,C++,Windows,Winapi,Service,Mfc,平台:视窗10 架构:x64 工具链:MSVC 2017 DWORD SGFPM_EnableAutoOnEvent (HSGFPM hFpm, BOOL enable, HWND hwnd, void* reserved) 参数 pFPM SGFPM对象的句柄 启用 真:启用自动开启 FALSE:禁用自动打开 hwnd 接收自动开启消息的窗口句柄 保留的未使用 第三个参数要求窗口句柄接收自动开启消息。 示例应用程序是基于MFC的GUI应用程序,而不是服务 我的问题是第三个参数的值应该是多少。
DWORD SGFPM_EnableAutoOnEvent (HSGFPM hFpm, BOOL enable, HWND hwnd, void* reserved)
参数
pFPM
SGFPM对象的句柄
启用
真:启用自动开启
FALSE:禁用自动打开
hwnd
接收自动开启消息的窗口句柄
保留的未使用
第三个参数要求窗口句柄接收自动开启消息。
示例应用程序是基于MFC的GUI应用程序,而不是服务
我的问题是第三个参数的值应该是多少。在Linux中,我们填充一个空值,但我不知道在我的情况下应该输入什么。您必须创建一个窗口来接收来自函数SGFPM_enableAutooneEvent的事件,他们可能正在使用该函数,或者,无论如何,您正在创建一个windows服务,但他们没有UI,服务在winstation0上运行,并且UI对登录用户不可用,您的窗口仍将隐藏
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_APP_SGAUTOONEVENT:
WORD isFinger= wParam;
SGDeviceInfoParam device_info;
memcpy(&device_info, (SGDeviceInfoParam*)lParam,sizeof(device_info));
//Add your code here...
return 1;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
HWND CreateMyWindow(){
static const char* class_name = "DUMMY_CLASS";
WNDCLASSEX wx = {};
wx.cbSize = sizeof(WNDCLASSEX);
wx.lpfnWndProc = WndProc; // function which will handle messages
wx.hInstance = current_instance;
wx.lpszClassName = class_name;
if ( RegisterClassEx(&wx) ) {
return CreateWindowEx( 0, class_name, "dummy_name", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL );
}
return NULL;
}
然后,根据CreateMyWindow函数的结果,您可以在调用SGFPM_enableAutooneEvent时传递该参数,然后用您希望接收消息的窗口的
hwnd
(将其视为操作系统的标识符)填充该参数。你是如何发现这个价值的?不知道。。如果它是您可能使用的另一个应用程序,或者如果它是同一项目的一部分,您可以使用随MFC一起提供的MFCwindow@MarcoA.,这两个函数都说窗口句柄,它能与服务一起工作吗?“查找窗口”需要窗口名,因为我的程序是一个服务,所以它没有窗口名。GETSuffHWND也是CWD类的一个成员,它用于GUI,我的应用程序是一个用C++开发的Win32服务。通常服务没有Windows。您可以尝试传递NULL,在这种情况下,参数的处理方式取决于实现。如果您需要HWND,则Windows支持“仅消息窗口”的概念,您可以创建该窗口来接收消息,请参见@MarcoA.,使用NULL不会检测事件。