【问题标题】:Extract Window handle from application code running service从应用程序代码运行服务中提取窗口句柄
【发布时间】:2018-10-12 10:14:40
【问题描述】:

我正在编写一个用于连接生物识别设备的 Win32 C++ 服务。厂商提供的SDK使用MFC。我没有关于 MFC 的经验或知识。

平台:Windows 10

架构:x64

工具链:MSVC 2017

DWORD SGFPM_EnableAutoOnEvent (HSGFPM hFpm, BOOL enable, HWND hwnd, void* reserved)

参数

pFPM

SGFPM 对象的句柄

启用

TRUE:启用自动开启

FALSE:禁用自动开启

hwnd

接收自动开启消息的窗口句柄

保留未使用

第三个参数需要窗口句柄来接收 Auto-On 消息。 示例应用程序是基于 MFC 的 GUI 应用程序,而不是服务。

我的问题是第三个参数的值应该是多少。在 Linux 中,我们填写一个 NULL 值,但我不知道在我的情况下应该输入什么。

【问题讨论】:

  • 你用你想接收消息的窗口的hwnd(把它当作操作系统的标识符)填写它。你是如何找到这个值的?不知道.. 如果它是另一个应用程序,您可以使用 FindWindow 或者如果它是同一个项目的一部分,您可以使用 MFC 提供的 GetSafeHwnd 和 MFC 管理的窗口
  • @MarcoA.,这两个函数都说窗口句柄,它可以与服务一起使用吗?查找窗口需要窗口名称,因为我的程序是一项服务,所以它没有窗口名称。 GetSafeHwnd 也是用于 GUI 的 CWnd 类的成员,我的应用程序是用 C++ 开发的 Win32 服务。
  • 服务通常没有窗口。您可以尝试传递NULL,在这种情况下如何处理参数取决于实现。
  • 如果您需要 HWND,那么 Windows 支持“仅消息窗口”的想法,您可以创建它来接收消息,请参阅 stackoverflow.com/questions/4081334/…
  • @MarcoA.,使用 NULL 不会检测到事件。

标签: c++ windows winapi service mfc


【解决方案1】:

你必须创建一个窗口来接收来自函数 SGFPM_EnableAutoOnEvent 的事件,他们可能正在使用函数 SendMessagePostMessage,无论如何你正在创建一个 windows 服务并且他们没有 UI,服务运行在winstation0 并且用户界面对登录用户不可用,您的窗口无论如何都将被隐藏。

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_EnableAutoOnEvent

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多