WinForms WebBrowser блокирует ProcessCmdKey - PullRequest
2 голосов
/ 03 мая 2011

У меня есть простое приложение Windows Forms , которое представляет собой не что иное, как Form, которое содержит WebBrowser.

Я переопределяю ProcessCmdKey метод, и он отлично работает. Но, хотя у WebBrowser есть фокус, ProcessCmdKey все еще вызывается, однако он больше не принимает коды клавиш.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData){

    //When webbrowser has focus, only control or S are found - not both.
    if(keyData==(Keys.Control|Keys.S)){
        //Do things here.
        return true;
    }

    return false;
}

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

К сожалению, я не могу поймать Ctrl + S событие из ProcessCmdKey + слова Lo / Hi.

Но я могу поймать их из WebBrowserдокумент:

WebBrowser browser = new WebBrowser();

...
browser.Document.Body.KeyDown += new HtmlElementEventHandler(Body_KeyDown);
...
private void Body_KeyDown(Object sender, HtmlElementEventArgs e)
{
    if(e.KeyPressedCode==83 && e.CtrlKeyPressed)
        MessageBox.Show("Give me some cookies");
}

1 голос
/ 03 мая 2011

Вы пытались переопределить ProcessCmdKey WebBroswer ... Я смутно припоминаю, что браузер делает что-то необычное с всплывающими событиями ... для обеспечения безопасности. Да, вот оно:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx Говорит:

Этот метод вызывается во время предварительной обработки сообщения для обработки командных клавиш . Клавиши управления - это клавиши, которые всегда имеют приоритет над обычными клавишами ввода. Примеры командных клавиш включают в себя ускорители и ярлыки меню. Метод должен возвращать true, чтобы указать, что он обработал командный ключ, или false, чтобы указать, что ключ не является командным ключом. Этот метод вызывается только тогда, когда элемент управления размещен в приложении Windows Forms или в качестве элемента управления ActiveX.

Метод ProcessCmdKey сначала определяет, имеет ли элемент управления ContextMenu, и если да, позволяет ContextMenu обрабатывать командную клавишу. Если командная клавиша не является ярлыком меню, а у элемента управления есть родительский элемент, ключ передается методу ProcessCmdKey родительского элемента. Чистый эффект состоит в том, что командные ключи «пузырились» вверх по иерархии управления. В дополнение к клавише, которую нажал пользователь, данные клавиши также указывают, какие, если они есть, клавиши-модификаторы были нажаты одновременно с клавишей. Клавиши-модификаторы включают клавиши SHIFT, CTRL и ALT.

Не думаю, что это позволит вам перехватывать ключи браузера на уровне формы ... Я думаю, что события съедаются элементом управления WebBrowser.

Приветствия. Кит.


РЕДАКТИРОВАТЬ:

http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx говорит:

KeyCode Битовая маска для извлечения кода ключа из значения ключа. Модификаторы Битовая маска для извлечения модификаторов из значения ключа.

и пример содержит строки:

if(e.KeyCode != Keys.Back)

if (Control.ModifierKeys == Keys.Shift) {

Так что, я думаю, вам нужно немного перемешать этот ключ в его составных частях.

...