Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在按键上激活未聚焦的C程序(例如F1将标签设置为“Hello World”)_C#_Key_Listener - Fatal编程技术网

C# 在按键上激活未聚焦的C程序(例如F1将标签设置为“Hello World”)

C# 在按键上激活未聚焦的C程序(例如F1将标签设置为“Hello World”),c#,key,listener,C#,Key,Listener,我试图使我的程序激活它的任务,如果一个键被按下的任何地方,即使它不在焦点。(本例中仅使用F1,并将任务设置为标签上的文本为“Hello World”) 我看了看关键的听众、钩子等,想弄明白到底发生了什么让我头疼。有什么简单的方法可以实现这一点。看看这篇文章,你需要的是全局热键。我提供的链接将其封装成了一种非常有用的形式。您查看了吗?如果您希望在另一个应用程序处于前台时获得键盘输入,那么这可能是您的最佳选择。您需要pinvoke或查找托管包装器。您可以使用WIN API函数 [DllImport(

我试图使我的程序激活它的任务,如果一个键被按下的任何地方,即使它不在焦点。(本例中仅使用F1,并将任务设置为标签上的文本为“Hello World”)

我看了看关键的听众、钩子等,想弄明白到底发生了什么让我头疼。有什么简单的方法可以实现这一点。

看看这篇文章,你需要的是全局热键。我提供的链接将其封装成了一种非常有用的形式。

您查看了吗?如果您希望在另一个应用程序处于前台时获得键盘输入,那么这可能是您的最佳选择。您需要pinvoke或查找托管包装器。

您可以使用WIN API函数

[DllImport("user32")]
public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
在表单加载事件中注册热键:

private void Form_Load(object sender, EventArgs e)
{
    RegisterHotKey(Handle, 42, 0, (int)Keys.F1);
}
请记住,如果要挂接某些组合键,而不是零,则应传递以下值之一(对于Alt、Ctrl、Shift或Windows键):

此时,当您按F1键时,系统将发送到您的窗口。在WndProc内部处理它:

private const int WM_HOTKEY = 0x312;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == WM_HOTKEY)
    {
        if (!Visible)
            Visible = true;
        Activate();
        Keys vk = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
        int fsModifiers = ((int)m.LParam & 0xFFFF);

        if (vk == Keys.F1 && sModifiers == 0)
            label.Text = "Hello World";
    }
}

顺便说一句,关闭表单时不要忘记热键。

谢谢您的链接。需要一点时间来消化信息谢谢你的链接。从我所看到的,这个链接将帮助我更好地实现上面提到的RegisterHotKey,并了解如何正确设置它。我选择了另一篇文章作为答案。数字42代表什么?谢谢,我要试试这个。:)您提到要在退出时注销hokey。我对C#(和一般的windowsapi调用)还是很陌生,所以我确实知道在哪里放置触发器,但是我想知道您是否可以帮助我完成上面的实际命令。我仍然不能很好地理解那些.dll调用。这是hokey的id。只是一个假数字。如果一个窗口需要几个热键,则需要不同的ID。@Taoh这很简单-将此静态extern方法声明放在表单类中(与任何其他常用方法一样)。只是想知道,您引用的ID只需与“目标窗口进程”一起是唯一的,就可以分离字符。对吗?另外,我想知道你是如何得到WM_热键的0x312的。如果我理解vk部分,您删除修改器(4位),然后将收到的按键与F1进行比较,如果我想要shift alt F1,我必须使用sModifiers==12?
private const int WM_HOTKEY = 0x312;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == WM_HOTKEY)
    {
        if (!Visible)
            Visible = true;
        Activate();
        Keys vk = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
        int fsModifiers = ((int)m.LParam & 0xFFFF);

        if (vk == Keys.F1 && sModifiers == 0)
            label.Text = "Hello World";
    }
}