windows C#检测所有窗口中的按键事件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5450362/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 16:30:38  来源:igfitidea点击:

C# detecting key event in all windows

c#.netwindowsfocuskeyevent

提问by giger

Hey, i have some problem with key event handler. This is source:

嘿,我有一些关键事件处理程序的问题。这是来源:

using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        using System.Diagnostics;
        using System.Threading;

        namespace WindowsFormsApplication3
        {
            public partial class Form1 : Form
            {
                public Form1()
                {
                    InitializeComponent();
                }

                [System.Runtime.InteropServices.DllImport("user32.dll")]
                public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);


        public const int MOUSEEVENTF_LEFTDOWN = 0x02;
        public const int MOUSEEVENTF_LEFTUP = 0x04;
        public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
        public const int MOUSEEVENTF_RIGHTUP = 0x10;


                public void Form1_KeyPessed(object sender, KeyEventArgs e)
                {
                    if (e.KeyCode == Keys.F2)
                    {
                        DrawSquare();
                    }
                }

                public void DrawSquare()
                {
                    int line = Convert.ToInt16(textBox1.Text);
                    int time = Convert.ToInt16(textBox2.Text);

                    int x = MousePosition.X;
                    int y = MousePosition.Y;
                    Cursor.Position = new Point(x - line / 2, y - line / 2);
                    mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
                    Thread.Sleep(time);
                    Cursor.Position = new Point(x - line / 2, y + line / 2);
                    Thread.Sleep(time);
                    Cursor.Position = new Point(x - line / 2, y + line / 2);
                    Thread.Sleep(time);
                    Cursor.Position = new Point(x + line / 2, y - line / 2);
                    Thread.Sleep(time);
                    Cursor.Position = new Point(x - line / 2, y - line / 2);
                    mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
                    Thread.Sleep(time);
                    Cursor.Position = new Point(x, y);
                }
            }      
        }

Now it only draws square when i press F2 in form, but i want it to work on all windows. What should i need more? (this is kinda auto drawer for perfect shapes)

现在它只在我按 F2 时绘制正方形,但我希望它在所有窗口上都能工作。我还需要什么?(这是一种用于完美形状的自动抽屉)

回答by Ben Voigt

If you only want to handle a couple key combinations, you can use RegisterHotKey. If you want to detect all different key events, go with the global hook as Paul suggested.

如果您只想处理几个组合键,可以使用RegisterHotKey. 如果您想检测所有不同的关键事件,请按照 Paul 的建议使用global hook

回答by Paul D'Ambra

You need a global hook. There's a brilliant implementation here http://www.codeproject.com/KB/cs/globalhook.aspx

你需要一个全局钩子。这里有一个很棒的实现http://www.codeproject.com/KB/cs/globalhook.aspx