【问题标题】:NativeWindow's AssignHandle without a parent formNativeWindow 的 AssignHandle 没有父窗体
【发布时间】:2017-05-10 07:20:07
【问题描述】:

我有点困惑NativeWindow 应该用于什么。

我想做的是实例化一个NativeWindow-派生对象并用它来监听某些Windows事件——而不是在我的一种形式中监听它们。但是,我似乎明白,为了让窗口的消息泵接收消息,我需要为窗口分配一个句柄。我能找到的教程都是指为窗口分配“父表单”的句柄,这会部分地违背我的目标(好的,我将分离消息监听问题,但我仍然需要附加该问题到我的一种形式,而不是让它自己运行)。

所以,对于这个问题:

有没有办法构造一个NativeWindow,它能够在其消息泵中接收系统事件而不必使其成为另一种形式的“孩子”

【问题讨论】:

  • 听起来像XY problem。我不知道NativeWindow 类的目的(注册自己的窗口类?),但你能说出你想听哪些事件和听什么吗?有全局键盘/鼠标事件的钩子。
  • @Sinatr 由于这条评论 (stackoverflow.com/questions/16245706/…),我觉得 NativeWindow 是我的解决方案。我需要听 USB 设备连接/断开连接。
  • 你去过here吗?
  • @Sinatr 感谢您的提示。但是,我的窗口仍然没有收到系统事件:(
  • 是的,NativeWindow 足以完成这项工作。您必须派生自己的类,以便可以覆盖 WndProc()。并调用它的 CreateHandle() 方法来创建窗口。您传递的 CreateParams 在这里并不重要,默认值就可以了。不再需要时调用 DestroyHandle()。

标签: c# winforms


【解决方案1】:

我终于能够解决我的问题。我的问题是双重的:NativeWindow 本身和 USB 通知。

正确实现NativeWindow

感谢 Sinatr 为我指明了正确的方向。 This thread 为仅消息窗口问题提供了很好的解决方案。我用它作为我的窗口的基类。

接收 USB 通知消息 - 或任何其他需要句柄的消息

我想收听的消息是 USB 通知,为此我关注了this answer。我的问题是我必须注册那些将句柄作为参数传递的消息......但我没有注意,最终在CreateWindow()被调用之前就这样做了,所以没有有效的句柄。

因此,请确保您在派生类中执行以下操作:

public override bool CreateWindow()
{
    bool retval = base.CreateWindow();
    USBNotification.RegisterUSBDeviceNotification(this.Handle);
    // or the registration to any notification you need
    // or any use you have for the handle
    return retval;
}

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 2010-09-07
    • 2012-08-05
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多