Как получить HWND для окна - PullRequest
       13

Как получить HWND для окна

0 голосов
/ 06 октября 2019

У меня есть этот кусок кода, который работает на 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);

У меня есть WPFProject и я хочу использовать один и тот же класс, поэтому я пытаюсь изменить конструктор следующим образом:

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 «Окно» не содержит определения для «Обработчик», и нет доступного метода расширения «Обработчик», принимающего первый аргумент типа «Окно» (вы пропускаетеиспользуя директиву или ссылку на сборку?)

1 Ответ

0 голосов
/ 06 октября 2019

Используя WPF, существует класс WindowInteropHelper для получения требуемого дескриптора.

Члены этого класса позволяют вызывающей стороне иметь внутренний доступ к Win32 HWND и родительскому HWNDокна WPF.

После создания WindowInteropHelper вы можете использовать его дескриптор, как это было сделано с Form. В вашем случае конструктор должен выглядеть следующим образом:

public GlobalHotkey(int modifier, Keys key, Window window)
{
    this.modifier = modifier;
    this.key = (int)key;
    //Use handle to register or unregister hotkey
    var helper = new WindowInteropHelper(window);
    this.hWnd = helper.Handle;
    id = this.GetHashCode();
}   

Обратите внимание, что вы также можете передать IntPtr.Zero в качестве дескриптора, если горячая клавиша не должна приниматься конкретным окном.

...