2010-01-06 3 views
1

Я разрабатываю систему XAML, которая в настоящее время включает значок на панели задач, который пользователь должен навести на себя, чтобы открыть главное окно. Однако мне необходимо учитывать доступность в связи с юридическими вопросами, а также сделать систему более привлекательной для широкого круга пользователей. Чтобы сделать систему более доступной, я пытаюсь создать ярлык Windows, который позволит открыть главное окно программы из любого места в окнах.WPF Windows quickcut help

Код, над которым я работал, имеет 2 ошибки: во-первых, обработчик событий срабатывает только в том случае, если само приложение является фокусом, где, поскольку требуемые ярлыки должны быть доступны, в то время как другие окна в фокусе и т. д. Во-вторых, в обработчике события он не обнаруживает одновременное нажатие Alt & Q. Код, который я создал, можно найти ниже, я просто ищу способ обработать ярлык Alt & Q из любого места в среде Windows и обнаружить, что кнопки были нажаты, поэтому окно можно открыть.

Любая помощь или совет будут оценены.

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

+0

Да, это связано с тем, как работает система, и пользователи должны использовать мышь, чтобы навести курсор на маленький значок на панели задач, который затем открывает приложение. Это создаст проблему для слепых пользователей, поэтому я ищу создать ярлык, чтобы открыть окно, когда пользователь нажимает на них. – manemawanna

+0

Я думаю, что я нашел способ сделать это, но это немного взломанная работа, поскольку она включает добавление пространства имен system.windows.forms и использование крючка в командах клавиатуры microsoft, которые я нашел в CodeProject. – manemawanna

ответ

2

Два комментария:

Во-первыхам, я хотел бы избавиться от "зависания" требования. Если вы используете стандартный метод добавления вашего приложения на панель задач, например, используя System.Windows.Forms.NotifyIcon, вы должны открыть окно приложения при двойном щелчке. Кроме того, вы также можете добавить контекстное меню правой кнопки мыши. Таким образом, пользователь может использовать winkey + B, чтобы перейти в системный лоток, и влево/вправо, чтобы найти свой значок, введите двойной клик или кнопку приложения, чтобы щелкнуть правой кнопкой мыши.

Если по какой-либо причине это не работает в вашем конкретном сценарии.Я бы рекомендовал проверить, работает ли ваше приложение в событии Application_Start (это работает только в том случае, если вы хотите, чтобы один экземпляр вашего приложения был в любое время). Таким образом, если пользователь запускает приложение и уже открыт экземпляр приложения, просто восстановите состояние окна и выведите его на передний план.

Затем во время установки вы можете настроить стандартный ярлык Windows на рабочем столе или меню «Пуск» и установить горячую клавишу в свойствах ярлыка (это все можно сделать в коде). Затем, когда пользователь вводит клавишу быстрого доступа, ярлык запустит приложение, которое выполнит Application_Start, он увидит, что уже запущена версия (на панели задач) и выведет ее на передний план. Таким образом, достижение такого же результата более стандартным образом.

Надеюсь, я правильно понял, чего вы хотите достичь.

+0

Большое спасибо, я не знал, что winkey + B сделал это, и он достигает того, чего я действительно хотел без клавиши быстрого доступа, хотя у меня также есть эта работа. – manemawanna

1

Может быть, вы должны смотреть на RoutedCommand объектов, а InputGestures свойство

Вот MSDN из RoutedCommands и как установить его:

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

Основном у вас есть команда: ProcessDataCommand

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

Установите его в MenuItem или кнопки следующим образом:

<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

+0

Возможно, вам стоит взглянуть на крючок клавиатуры, который вызывается с помощью P/Invoke! Кто-то написал простой кейлоггер на C#, используя эту технику, возможно, вы можете извлечь нужные вам вещи: http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx. – Arcturus

+0

А я вижу, что вы уже нашли эту статью .. Вам не нужна Windows Form, чтобы она работала btw;), если вы можете распознать клавиши int, которые вы выбрали, вы можете обойтись без форм dll. P/Invoke находится в пространстве имен System.Runtime – Arcturus