2010-01-06 84 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