如何为窗口获取HWND

时间:2019-10-06 07:23:20

标签: c# wpf hotkeys

我有一段适用于Winform的代码:

public class GlobalHotkey
{
    private int modifier;
    private int key;
    private IntPtr hWnd;
    private int id;

    public GlobalHotkey(int modifier, Keys key, Form form)
    {
        this.modifier = modifier;
        this.key = (int)key;
        this.hWnd = form.Handle;
        id = this.GetHashCode();
    }

    public bool Register()
    {
        return RegisterHotKey(hWnd, id, modifier, key);
    }

    public bool Unregiser()
    {
        return UnregisterHotKey(hWnd, id);
    }

    public override int GetHashCode()
    {
        return modifier ^ key ^ hWnd.ToInt32();
    }

    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

    [DllImport("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
}

InitializeComponent之后,我以这种方式启动它:

ghk = new GlobalHotkey(Constants.CTRL + Constants.SHIFT, Keys.A, this);

我有一个WPF项目,并且我想使用相同的类,所以我尝试以这种方式更改构造函数:

public GlobalHotkey(int modifier, Keys key, System.Windows.Window form)
{
    this.modifier = modifier;
    this.key = (int)key;
    this.hWnd = form.Handle;
    id = this.GetHashCode();
}

但是我在这行有一个编译时错误:

this.hWnd = form.Handle;
  

严重性代码描述项目文件行抑制状态   错误CS1061“窗口”不包含“句柄”的定义,并且   没有可访问的扩展方法'Handle'接受第一个参数   可以找到“窗口”类型(您是否缺少using指令或   程序集参考?)

1 个答案:

答案 0 :(得分:0)

使用WPF,存在WindowInteropHelper类来获取所需的句柄。

  

此类的成员使调用者可以内部访问   Win32 HWND和WPF窗口的父HWND。

创建git status后,您可以像使用@IBAction func buttonClicked(_ sender: UIButton) { sender.setImage(UIImage(named:"Your image name here"), for: .normal) } 一样使用它的句柄。在您的情况下,构造函数应如下所示:

WindowInteropHelper

请注意,如果不需要特定窗口接收热键,也可以传递Form作为句柄。