首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# WPF设置F HotKeys

C# WPF设置F HotKeys
EN

Stack Overflow用户
提问于 2016-01-24 01:48:12
回答 2查看 801关注 0票数 2

我尝试将System.Windows.Input.KeyEventArgs转换为System.Windows.Forms.KeyEventArgs,但它不起作用。当其他F键发出文本命令时,activeTracker就像是我的循环的触发器。

代码语言:javascript
复制
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>
EN

回答 2

Stack Overflow用户

发布于 2016-01-24 02:00:17

使用Key属性:

代码语言:javascript
复制
    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属性与字符串进行比较的,因为a)是WinForms,它返回的是Keys值。

您的KeyDown处理程序无法编译,因为您使用了错误的变量名activateTracker而不是activeTracker

改变这一点,并确保显式引用KeyEventArgsSystem.Windows.Input版本,您就应该准备好了。

票数 2
EN

Stack Overflow用户

发布于 2018-11-05 20:09:16

您不需要设置它们。您可以使用FrameworkElement.KeyDown事件处理程序。

如果您的应用程序只有一个窗口,您可以直接将它们添加到代码中。

代码语言:javascript
复制
private void Window_KeyDown(object sender, KeyEventArgs e)
   {
   switch(e.Key)
   {
   // Add cases for F buttons.
   }
}

但如果您的应用程序使用多个windows,则可以使用:

代码语言:javascript
复制
public static class KeyF
{
    public static void RunF(KeyEventArgs e)
    {
        switch(e.Key)
        {
           // Add cases for F keys.
          // And do stuff.
        }
    }
}

然后用KeyF.RunF(e);运行它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34966732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档