C#模拟键盘鼠标事件-SendKeys

8596人阅读评论(1)收藏举报
//英文输入
this.richTextBox1.Focus();                                            
for(int i=65;i<91;i++)
            {
char Letter=(char)i;
                SendKeys.Send(Letter.ToString());
                System.Threading.Thread.Sleep(100);        
                SendKeys.Flush();
            }        
for(int i=97;i<123;i++)
            {
char Letter=(char)i;
                SendKeys.Send(Letter.ToString());
                System.Threading.Thread.Sleep(100);
                SendKeys.Flush();
            }        
        }
 
private void button3_Click(object sender, System.EventArgs e)
        {//数字输入
this.richTextBox1.Focus();                                            
for(int i=0;i<10;i++)
            {                
                SendKeys.Send(i.ToString());
                System.Threading.Thread.Sleep(100);        
                SendKeys.Flush();
            }                
        }
 
private void button4_Click(object sender, System.EventArgs e)
        {//Backspace
this.richTextBox1.Focus();
            SendKeys.Send("{Backspace}");        
        }
 
private void button5_Click(object sender, System.EventArgs e)
        {//Home
this.richTextBox1.Focus();
            SendKeys.Send("{Home}");                
        }
 
private void button6_Click(object sender, System.EventArgs e)
        {//End
this.richTextBox1.Focus();
            SendKeys.Send("{End}");        
        }
 
private void button7_Click(object sender, System.EventArgs e)
        {//Enter
this.richTextBox1.Focus();
            SendKeys.Send("{Enter}");        
        }
 
private void button8_Click(object sender, System.EventArgs e)
        {//Delete
this.richTextBox1.Focus();
            SendKeys.Send("{Delete}");        
        }
 
private void button2_Click(object sender, System.EventArgs e)
        {//Shift+Home
this.richTextBox1.Focus();
            SendKeys.Send("+{Home}");                
        }
 
private void button9_Click(object sender, System.EventArgs e)
        {//Shift+End
this.richTextBox1.Focus();
            SendKeys.Send("+{End}");                

}

看下方法的说明


public class SendKeys : System.Object
    System.Windows.Forms 的成员
 
摘要:
 提供将键击发送到应用程序的方法。  

public static void Send ( System.String keys )
    System.Windows.Forms.SendKeys 的成员
 
摘要:
 向活动应用程序发送击键。  

public static void Sleep ( System.TimeSpan timeout )
    System.Threading.Thread 的成员
 
摘要:

将当前线程阻塞指定的时间。



public static void Flush (  )
    System.Windows.Forms.SendKeys 的成员
 
2.模拟鼠标
有时,我们需在我们的程序中模拟鼠标的移动、点击等动作。——比如,一个再现用户操作的宏,或者一个演示操作方法的Demo程序。那么,我们在.Net中如何实现呢?

.Net并没有提供改变鼠标指针位置、模拟点击操作的函数;但是Windows API提供了。其中一个是:
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);

该函数可以改变鼠标指针的位置。其中X,Y是相对于屏幕左上角的绝对位置。
另一个函数是:

[DllImport("user32.dll")]
static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

这个函数不仅可以设置鼠标指针绝对的位置,而且可以以相对坐标来设置。另外,该函数还可以模拟鼠标左右键点击、鼠标滚轮操作等。其中的MouseEventFlag是一个基于uint类型的枚举,定义如下:

[Flags]
enum MouseEventFlag : uint
{
Move
= 0x0001,
LeftDown
= 0x0002,
LeftUp
= 0x0004,
RightDown
= 0x0008,
RightUp
= 0x0010,
MiddleDown
= 0x0020,
MiddleUp
= 0x0040,
XDown
= 0x0080,
XUp
= 0x0100,
Wheel
= 0x0800,
VirtualDesk
= 0x4000,
Absolute
= 0x8000
}

关于这两个函数的详细说明,可以查看MSDN Library或者Windows的Platform SDK文档。
下面的演示程序(完整版源代码,VS.Net 2005/C#)演示了使用上面的函数,控制鼠标移动到任务栏并点击“开始”按钮的方法。
(该程序使用了FindWindowEx等API函数来查找任务栏及开始菜单)

点这里下载

posted on 2007-08-07 22:01 Thunderdanky 阅读(185) 评论(3)  编辑  收藏 所属分类: .NET技术文章
[转载]C#模拟键盘鼠标事件-SendKeys
C#模拟键盘鼠标事件

一个简单的模拟键盘鼠标操作的类

一个简单的模拟键盘鼠标操作的类,扩充 VirtualKeys 枚举就可以了,或者直接写!

using System;
using System.Runtime.InteropServices;
using System.Text;
class Keyboard
{
const uint KEYEVENTF_EXTENDEDKEY = 0x1;
const uint KEYEVENTF_KEYUP = 0x2;
[DllImport("user32.dll")]
static extern short GetKeyState(int nVirtKey);
[DllImport("user32.dll")]
static extern void keybd_event(
byte bVk,
byte bScan,
uint dwFlags,
uint dwExtraInfo
);

public enum VirtualKeys: byte
{
VK_NUMLOCK = 0x90, //数字锁定键
VK_SCROLL = 0x91, //滚动锁定
VK_CAPITAL = 0x14, //大小写锁定
VK_A = 62
}


public static bool GetState(VirtualKeys Key)
{
return (GetKeyState((int)Key)==1);
}
public static void SetState(VirtualKeys Key, bool State)
{
if(State!=GetState(Key))
{
keybd_event(
(byte)Key,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0
);
keybd_event(
(byte)Key,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0
);
}
}
}

示例:
模拟操作
Keyboard.SetState(
VirtualKeys.VK_CAPITAL,
!Keyboard.GetState(VirtualKeys.VK_CAPITAL)
);
得到键盘状态
Keyboard.GetState(VirtualKeys.VK_CAPITAL)

* 十进制值 标识符 IBM兼容键盘 

--------------------------------------------------------------------------------

1    VK_LBUTTON   鼠标左键
2    VK_RBUTTON   鼠标右键
3    VK_CANCEL   Ctrl+Break(通常不需要处理)
4    VK_MBUTTON   鼠标中键
8    VK_BACK    Backspace
9    VK_TAB     Tab
12   VK_CLEAR    Num Lock关闭时的数字键盘5
13   VK_RETURN   Enter(或者另一个)
16   VK_SHIFT    Shift(或者另一个)
17   VK_CONTROL   Ctrl(或者另一个)
18   VK_MENU    Alt(或者另一个)
19   VK_PAUSE    Pause
20   VK_CAPITAL   Caps Lock
27   VK_ESCAPE   Esc
32   VK_SPACE    Spacebar
33   VK_PRIOR    Page Up
34   VK_NEXT    Page Down
35   VK_END     End
36   VK_HOME    Home
37    VK_LEFT    左箭头
38   VK_UP     上箭头
39   VK_RIGHT   右箭头
40   VK_DOWN    下箭头
41   VK_SELECT   可选
42   VK_PRINT   可选
43   VK_EXECUTE  可选
44   VK_SNAPSHOT  Print Screen
45   VK_INSERT   Insert
46   VK_DELETE  Delete
47   VK_HELP   可选
48~57  无      主键盘上的0~9
65~90  无      A~Z
96~105  VK_NUMPAD0~VK_NUMPAD9   Num Lock打开时数字键盘上的0~9
106   VK_NULTIPLY         数字键盘上的*
107   VK_ADD           数字键盘上的+
108   VK_SEPARATOR        可选
109   VK_SUBTRACT         数字键盘上的-
110   VK_DECIMAL         数字键盘上的.
111   VK_DIVIDE          数字键盘上的/
112~135 VK_F1~VK_F24        功能键F1~F24
144   VK_NUMLOCK         Num Lock
145   VK_SCROLL          Scroll Lock

*/


突然发现在c#里面原来还有一个 System.Windows.Forms.SendKeys

不过这个只能模拟键盘


真正能模拟鼠标操作的代码在这里!找的我好辛苦啊!

函数声明:
private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;
private readonly int MOUSEEVENTF_LEFTUP = 0x4;
[DllImport("user32")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

调用方法:
mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0);
其中X,Y分别是你要点击的点的横坐标和纵坐标

相关文章: