2016-01-23 3 views
1

Я пытаюсь создать небольшое приложение, выполняющее определенные функции при нажатии клавиш F (F1, F2 & F3 в текущем контексте). Недавно я начал играть с горячими клавишами на C#, но я не могу понять, как это понять. Я пробовал переименовывать System.Windows.Input.KeyEventArgs в System.Windows.Forms.KeyEventArgs, но он не работает. Я не уверен, что это лучший/правильный способ сделать это, но да, логически это имеет смысл для меня. activeTracker действует как триггер для моего цикла, а другие клавиши F отправляют текстовые команды.C# WPF Настройка F HotKeys

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
     public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

     [DllImport("user32.dll")] 
     public static extern bool SetForegroundWindow(IntPtr hWnd); 

     bool activeTracker = false; 

     private void btnActive_Click(object sender, RoutedEventArgs e) 
     { 
      while (activeTracker) 
      { 
       IntPtr WindowHandle = FindWindow(txtClassName.Text, txtWindowTitle.Text); 
       if (WindowHandle == IntPtr.Zero) 
       { 
        System.Windows.MessageBox.Show(txtWindowTitle.Text + " does not exist"); 
        return; 
       } 

       SetForegroundWindow(WindowHandle); 

       SendKeys.SendWait(txtMessage1.Text + "{ENTER}"); 
       System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1)); 
       SendKeys.SendWait(txtMessage2.Text + "{ENTER}"); 
      } 
     } 

     private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
     { 
      if (e.KeyCode == "F1") 
      { 
       activateTracker = True; 
       return; 
      }else if(e.KeyCode == "F2") 
      { 
       activateTracker = False; 
       return; 
      }else if(e.KeyCode == "F3") 
      { 
       SendKeys.SendWait(txtMessage5.Text + "{ENTER}"); 
      } 
     } 
    } 
} 


<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" KeyDown="Window_KeyDown"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="108*"/> 
      <ColumnDefinition Width="409*"/> 
     </Grid.ColumnDefinitions> 
     <TextBox x:Name="txtWindowTitle" HorizontalAlignment="Left" Height="23" Margin="176,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" Visibility="Hidden" Text="Value1" Grid.Column="1"/> 
     <TextBlock HorizontalAlignment="Left" Margin="33,130,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Grid.Column="1"/> 
     <TextBox x:Name="txtClassName" HorizontalAlignment="Left" Height="23" Margin="176,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="233" Visibility="Hidden" Text="Value2" Grid.Column="1"/> 
     <Label Content="Message 1:" HorizontalAlignment="Left" Margin="10,37,0,0" VerticalAlignment="Top"/> 
     <Label Content="Message 2:" HorizontalAlignment="Left" Margin="10,68,0,0" VerticalAlignment="Top"/> 
     <TextBox x:Name="txtMessage1" HorizontalAlignment="Left" Height="23" Margin="96,40,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="370" Grid.ColumnSpan="2"/> 
     <Label Content="Message 3:" HorizontalAlignment="Left" Margin="10,99,0,0" VerticalAlignment="Top"/> 
     <TextBox x:Name="txtMessage2" HorizontalAlignment="Left" Height="23" Margin="96,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="370" Grid.ColumnSpan="2"/> 
     <TextBox x:Name="txtMessage3" HorizontalAlignment="Left" Height="23" Margin="96,102,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="370" Grid.ColumnSpan="2"/> 
     <Button x:Name="btnActive" Content="Activate" HorizontalAlignment="Left" Margin="56,237,0,0" VerticalAlignment="Top" Width="75" Click="btnActive_Click" Grid.ColumnSpan="2"/> 
     <TextBox x:Name="txtMessage5" HorizontalAlignment="Left" Height="23" Margin="96,146,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="370" Grid.ColumnSpan="2"/> 


    </Grid> 
</Window> 
+0

Установили ли вы контрольную точку в обработчике события 'Window_KeyDown', чтобы убедиться, что она вызвана? Вы не показываете XAML, поэтому я могу только предположить, что вы добавляете событие KeyDown. – ChrisF

+0

Добавил мой код XAML к моему сообщению, не совсем уверен, что вы имеете в виду, установив точку останова. – HereToLearn

+0

Используйте отладчик Visual Studio - «F5». Нажмите «F9» в строке, где вы хотите, чтобы код остановился, чтобы вы могли проверить переменные и проверить, что они являются значениями, которые вы ожидаете от них. – ChrisF

ответ

1

Используйте Key свойство:

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     switch (e.Key) 
     { 
      case Key.F1: 
       activeTracker= True; 
       break; 
      case Key.F2: 
       activeTracker= False; 
       break; 
      case Key.F3: 
       SendKeys.SendWait(txtMessage5.Text + "{ENTER}"); 
       break; 
    } 

Я не знаю, как вы управляете сравнить KeyCode свойство со строкой как а) это WinForms и б) она возвращает Keys значение в любом случае ,

Ваш обработчик KeyDown не будет компилироваться, потому что у вас было неправильное имя переменной activateTracker вместо activeTracker.

Измените это и убедитесь, что вы явно ссылаетесь на System.Windows.Input версию KeyEventArgs, и вам должно быть хорошо идти.

+0

Когда я использую следующий оператор switch, активацияTracker по какой-то причине не существует в текущем контексте. Хотя это глобальная переменная. – HereToLearn

+1

@HereToLearn, если вы только что заменили существующий обработчик событий KeyDown этим кодом, тогда я не понимаю, почему он не должен компилироваться. – ChrisF

+0

Да, однако, когда я использовал следующий код, KeyEventArgs попросил меня изменить его на System.Windows.Input.KeyEventArgs или System.Windows.Forms.KeyEventArgs. При использовании Input переменная actionTracker не может быть найдена, а при использовании форм «ключ» не содержит определения. Что мне здесь не хватает? – HereToLearn