【问题标题】:How to get a window handle to a COM Single-Threaded Apartment (STA)?如何获取 COM 单线程单元 (STA) 的窗口句柄?
【发布时间】:2010-10-07 01:56:12
【问题描述】:

CoInitialize(NULL) 通过创建隐藏窗口来创建 STA。如何获取此窗口的 HWND 句柄?

函数 EnumThreadWindows 不起作用,在我尝试的示例中:

...

CoInitialize(NULL);

EnumThreadWindows(GetCurrentThreadId(), EnumThreadWndProc, 0);

...

BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
{
   m_hwnd = hwnd;

   return FALSE;
}

没有任何东西进入 EnumThreadWndProc。

有什么想法吗?

【问题讨论】:

  • 你到底为什么需要这个? AFAIK,那个窗口是一个实现细节,最好不要管它。
  • 同上。不要乱搞香肠制作的内脏。

标签: winapi com


【解决方案1】:

这个隐藏窗口是Message-Only Window,不可见,没有z-order,不能枚举,不接收广播消息。窗口只是发送消息。

要查找仅消息窗口,请在 FindWindowEx 函数的 hwndParent 参数中指定 HWND_MESSAGE。此外,如果 hwndParent 和 hwndChildAfter 参数都为 NULL,FindWindowEx 会搜索仅消息窗口以及顶级窗口。

来源: MSDN

【讨论】:

    【解决方案2】:

    顺便说一句,我会非常在这里小心 - 你真的不应该将窗口消息发送到你不拥有的窗口。您的代码很可能在未来的 Windows 版本中出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2011-07-14
      • 2015-02-10
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多