2016-12-08 23 views
0

我是一個相當新的Visual C#,但長時間在Delphi中編碼。我創建了一個具有隱藏的簡單面板的窗體,除非您在鍵盤上鍵入特定的按鍵(我確實將「KeyPreview」設置爲窗體的true,並且我使用KeyDown事件來處理確定正確的按鍵被按下並使面板可見/不可見)。面板下面是一個web瀏覽器組件。確保C#表格具有焦點時它應該

正在發生的事情如下:

當我的形式開始啓動,我對「中顯示」事件代碼,確保形式已初步重點:

private void Form1_Shown(object sender, EventArgs e) 
{ 
    if (!Focused) 
    { 
     Focus(); 
    } 
} 

當窗體在這一點上,我的代碼用於檢測正確的按鍵以使面板出現或消失很好。

這裏是事情變得奇怪,我不知道該怎麼做。有兩個部分我處理的,什麼是錯的:

  1. 如果我再次點擊另一種形式,然後在我的窗體的標題欄來獲得表單上的焦點,並嘗試一個按鍵,該按鍵檢測不起作用。但是,如果我再次單擊另一個表單並返回到表單上,表單的擊鍵檢測功能仍然有效。我可以做些什麼來確保每次我的聚焦時都能發揮作用?

  2. 如果我單擊我自己窗體中的Web瀏覽器組件,窗體的KeyDown代碼就不再執行。即使我單擊表單的標題欄,KeyDown事件也不起作用。我需要做些什麼來保證,如果我的表單中的組件被點擊,我的表單仍然會響應KeyDown事件?

在此先感謝您的任何建議。

+0

你能爲你的標題欄顯示代碼嗎? –

+0

就是這樣。我沒有任何標題欄的代碼。我只是爲窗體本身提供了KeyDown事件的代碼。 – Andre72127

回答

0

我不能說爲什麼你的標題欄似乎攔截關鍵事件。這可能是因爲表單上的各種組件可能具有焦點並因此捕獲鍵盤事件。我知道網絡瀏覽器控件以這種方式工作。您可以考慮全球捕獲鍵盤事件。

我看到Codeproject上顯示瞭如何做到這一點。我希望這有幫助。

他們使用UserActivityHooks。

UserActivityHook actHook; 
void MainFormLoad(object sender, System.EventArgs e) 
{ 
    actHook= new UserActivityHook(); // crate an instance 

// hang on events 

    actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved); 
    actHook.KeyDown+=new KeyEventHandler(MyKeyDown); 
    actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress); 
    actHook.KeyUp+=new KeyEventHandler(MyKeyUp); 
} 

至於網頁瀏覽器控件,當然它將與鍵盤事件有關。用戶通常不得不在表單中輸入文本,開發人員通常會在網頁上編寫javascript代碼以專門掛鉤到鍵盤事件中。因此,網頁瀏覽器控件必須能夠捕獲這些內容。

相關問題