2011-05-03 120 views
2

我有一個簡單的Windows窗體應用程序,只不過是Form包含WebBrowserWinForms WebBrowser blocking ProcessCmdKey

我重寫了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; 
} 
+0

你嘗試覆蓋在WebBroswer ...我依稀記得瀏覽器做了時髦與bubbing機事件...到做與安全。是的 – corlettk 2011-05-03 09:47:05

+0

這是ActiveX託管協議的副作用。 IOleControlSite :: TranslateAccelerator()。 Ctrl + S是Internet Explorer的快捷鍵。你可以做的事情不多。 – 2011-05-03 23:41:22

回答

1

你嘗試重寫WebBroswer的ProcessCmdKey ......我依稀記得瀏覽器不會與bubbing向上事件時髦的東西...做的安全性。是的,這就是:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx說:

這種方法預處理的消息時被調用來處理命令鍵。命令鍵是始終優先於常規輸入鍵的鍵。命令鍵的例子包括加速器和菜單快捷鍵。該方法必須返回true以指示它已處理命令鍵,否則返回false以指示該鍵不是命令鍵。僅當控件託管在Windows窗體應用程序或ActiveX控件中時,纔會調用此方法。

ProcessCmdKey方法首先確定控件是否具有ContextMenu,如果是,則啓用ContextMenu來處理命令鍵。如果命令鍵不是菜單快捷方式,並且控件具有父項,則該項將傳遞給父項的ProcessCmdKey方法。最終結果是命令鍵在控制層次上「冒泡」。除了用戶按下的按鍵之外,按鍵數據還指示哪個(如果有的話)修飾鍵與按鍵同時按下。修飾鍵包括SHIFT,CTRL和ALT鍵。

我不認爲它會讓你攔截窗體級別的瀏覽器鍵......我認爲事件被WebBrowser控件所佔用。

乾杯。基思。


編輯:

http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx說:

邀請碼位掩碼從鍵值提取鍵代碼。 修飾符用於從鍵值中提取修飾符的位掩碼。

和示例包含線路:

if(e.KeyCode != Keys.Back) 

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

所以我猜你需要位擺弄那個鍵進入它的組成部分。

+0

嗨基思,謝謝你的回答,雖然我不能說我完全理解。我已經嘗試覆蓋WebBrowser的ProcessCmdKey,並返回true或false,但是沒有做任何事情,儘管我在您提供的MSDN鏈接中似乎_Do不使用此枚舉中的值進行組合按位操作。枚舉中的值不是相互排斥的。我怎樣才能解決這個問題? – R4D4 2011-05-03 10:10:19

+0

Geez dude,RTFM!直接在該警告之上:Keys類包含用於處理鍵盤輸入的常量。 Keys枚舉的成員由一個鍵碼和一組修飾符組成一個整數值。在Win32應用程序編程接口(API)中,鍵值有兩半,高位包含鍵代碼(與Windows虛擬鍵代碼相同),低位代表鍵控修飾符,如SHIFT,CONTROL和ALT鍵。 – corlettk 2011-05-03 10:18:01

+0

我明白,有兩部分,但我不明白我如何可以提取上部和下部的部分,示例'if(Control.ModifierKeys == Keys.Shift){'似乎相當無用 - 我沒有KeyEventArgs目的。 – R4D4 2011-05-03 10:37:03

1

Unfortunaley我無法從ProcessCmdKey +高/低的話趕按Ctrl +小號事件

但我可以從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"); 
}