2010-01-06 113 views
1

我正在開發一個XAML系統,它目前在任務欄中包含一個用戶必須懸停的圖標才能打開主窗口。但是,由於法律問題,我需要考慮無障礙,並使系統儘可能吸引廣泛的用戶。爲了使系統更容易訪問,我正在嘗試創建一個窗口快捷方式,它將允許主窗口從窗口的任何其他地方打開。WPF Windows快捷鍵幫助

我一直在處理的代碼有兩個錯誤,第一個是事件處理程序只在應用程序本身是焦點時觸發,其中我需要的快捷方式必須能夠打開,而其他窗口是打開的焦點等。第二個是在事件處理程序中,它不檢測同時按下的Alt &。我創建的代碼可以在下面找到,我只是在尋找一種方法來處理Windows環境中的任何位置的快捷鍵Alt和Alt,並檢測它們是否已按下按鈕,因此窗口可以打開。

任何幫助或建議,將不勝感激。

this.KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_Keydown); 

private void Window_Keydown(object sender, KeyEventArgs e) 
    { 
     if ((e.KeyboardDevice.Modifiers == ModifierKeys.Alt) && (e.Key == Key.Q)){} 
    } 
+0

所以你想要捕捉系統中的所有擊鍵?即使你的應用程序沒有重點,或最小化? – TalkingCode 2010-01-06 16:12:30

+0

是的,這是由於系統工作的方式,用戶必須使用鼠標將鼠標懸停在任務欄中的小圖標上,然後才能打開該應用程序。這將對盲人用戶構成挑戰,因此我正在尋找創建快捷方式以在用戶按下時打開窗口。 – manemawanna 2010-01-07 09:58:43

+0

我想我已經找到了一個這樣做的方法,但是它有點像黑客工作,因爲它會添加system.windows.forms命名空間並在我在CodeProject上找到的Microsoft鍵盤命令中使用鉤子。 – manemawanna 2010-01-07 10:09:14

回答

2

兩點意見:

首先,我想擺脫 「懸停」 的要求。如果使用將應用程序添加到任務欄的標準方法(例如使用System.Windows.Forms.NotifyIcon),則應該在雙擊它時打開應用程序窗口。或者,您也可以添加右鍵單擊上下文菜單。通過這種方式,用戶可以使用winkey + B進入系統托盤,然後左/右找到您的圖標,進入雙擊或應用程序鍵右鍵單擊。

如果由於某種原因,這在您的特定情況下不起作用。我建議檢查你的應用程序是否在Application_Start事件中運行(這隻有在你需要任何時候你的應用程序的單個實例時纔有效)。所以,如果用戶運行應用程序,並且已經打開了應用程序的實例,只需恢復窗口狀態並將其置於前臺。

然後,在安裝過程中,您可以在桌面或開始菜單上設置標準Windows快捷方式,並在快捷方式屬性中設置熱鍵(這些都可以在代碼中完成)。然後,當用戶鍵入快捷鍵時,快捷方式將啓動應用程序,Application_Start將執行,它會看到有一個版本已經在運行(在任務欄中)並將其帶到前臺。從而以更標準的方式達到相同的結果。

我希望我能正確理解你想達到的目標。

+0

非常感謝你,我不知道winkey + B是否做到了這一點,並且沒有快捷鍵就可以實現我想要的功能,儘管我也有這樣的工作。 – manemawanna 2010-01-11 10:10:27

1

也許你應該看看RoutedCommand對象和InputGestures財產

這裏是RoutedCommands的MSDN以及如何設置它:

http://msdn.microsoft.com/en-us/library/system.windows.input.routedcommand.aspx

Basicly你有一個命令:ProcessDataCommand

public class MyCommands 
{ 
    public static readonly RoutedCommand ProcessDataCommand = new RoutedCommand(); 
} 

將其設置爲你的菜單項或按鈕,如下所示:

<Button Command="{x:Static NameSpace:MyCommands.ProcessDataCommand}" /> 

,並添加一個CommandBinding到要處理你的命令的控制: http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

<Window x:Class="WCSamples.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="CloseCommand" 
    Name="RootWindow" 
    > 
    <Window.CommandBindings> 
    <CommandBinding Command="{x:Static NameSpace:MyCommands.ProcessDataCommand}" 
        Executed="CloseCommandHandler" 
        CanExecute="CanExecuteHandler" 
        /> 
    </Window.CommandBindings> 
    <StackPanel Name="MainStackPanel"> 
    <Button Command="{x:Static NameSpace:MyCommands.ProcessDataCommand}" 
      Content="Close File" /> 
    </StackPanel> 
</Window> 

現在的shortkey魔術;)

您在哪裏定義了您的命令,請添加以下靜態構造函數:

static MyCommands() 
{ 
    ProcessDataCommand.InputGestures.Add(new KeyGesture(Key.Q, ModifierKeys.Alt)); 
} 

而且你的命令也會響應這個快捷鍵!

這裏下載一個路由命令樣本: http://www.codeplex.com/wpfroutedcommand

希望這有助於

+0

有點,但我沒有在應用程序本身做任何事情,只是試圖在應用程序最小化時打開主窗口。 – manemawanna 2010-01-07 10:01:39

+0

啊,你可能想看看用P/Invoke調用的Keyboard鉤子!有人使用這種技術在C#中編寫了一個簡單的鍵盤記錄程序,也許你可以提取你需要的東西:http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx。 – Arcturus 2010-01-07 11:44:10

+0

啊,我看到你已經找到那篇文章..你不需要Windows窗體使它工作順便;)如果你可以識別整數的鍵扔掉,你可以沒有窗體的DLL。 P/Invoke位於System.Runtime命名空間 – Arcturus 2010-01-07 11:45:36