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
C# detecting key event in all windows
提问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

