如题 我要写一个模拟键盘 要做成一个 WPF user control library在wpf里边好像 sendKey.send(); 好像不好用那位知道怎么模拟键盘输入呢?

解决方案 »

  1.   


    其实SendKeys类提供的方法蛮好用的,可惜的是WPF中不能用了,说是WPF的消息循环方式改成了Dispatcher,所以直接调用System.Windows.Forms.SendKeys.Send()方法会报错. 不过没关系, 至少有use32的SendInput可用,通过P/Invoke方式,我们可以模拟键盘或鼠标操作.定义是这样的:[DllImport("user32.dll", SetLastError = true)]
    internal static extern int SendInput(int nInputs, ref INPUT mi, int cbSize);
    其中的INPUT结构表示一个键盘或鼠标操作:
    [StructLayout(LayoutKind.Sequential)]
    internal struct INPUT
    {
    internal int type;
    internal INPUTUNION union;
    };
    [StructLayout(LayoutKind.Explicit)]
    internal struct INPUTUNION
    {
    [FieldOffset(0)]
    internal MOUSEINPUT mouseInput;
    [FieldOffset(0)]
    internal KEYBDINPUT keyboardInput;
    };
    [StructLayout(LayoutKind.Sequential)]
    internal struct MOUSEINPUT
    {
    internal int dx;
    internal int dy;
    internal int mouseData;
    internal int dwFlags;
    internal int time;
    internal IntPtr dwExtraInfo;
    };
    [StructLayout(LayoutKind.Sequential)]
    internal struct KEYBDINPUT
    {
    internal short wVk;
    internal short wScan;
    internal int dwFlags;
    internal int time;
    internal IntPtr dwExtraInfo;
    };
    [Flags]
    internal enum SendMouseInputFlags
    {
    Move = 0x0001,
    LeftDown = 0x0002,
    LeftUp = 0x0004,
    RightDown = 0x0008,
    RightUp = 0x0010,
    MiddleDown = 0x0020,
    MiddleUp = 0x0040,
    XDown = 0x0080,
    XUp = 0x0100,
    Wheel = 0x0800,
    Absolute = 0x8000,
    };
    关于这些方法或结构的定义在http://www.pinvoke.net/index.aspx 这个网站上可以查找得到(但不保证百分百靠谱) 下面这个代码文件做了一个很好的包装,可以下载后参考: 
    Simulation.zip 如何使用呢? 
    很简单, 要敲一个键, 比如回车:Keyboard.Press(Key.Enter);
    Keyboard.Release(Key.Enter);要敲一个组合键:比如Alt+F4
    Keyboard.Press(Key.LeftAlt);
    Keyboard.Press(Key.F4);
    Keyboard.Release(Key.LeftAlt);
    Keyboard.Release(Key.F4);
    要敲一段文字:
    Keyboard.Type("notepad");
    鼠标与之类似,比如:
    Mouse.MoveTo(new System.Drawing.Point(x, y));
    Mouse.Click(MouseButton.Right);
    http://www.cnblogs.com/sixty/archive/2009/08/09/1542210.html