C#鼠标坐标的控制,是鼠标控制的关键。坐标的提供,是精确定位的基础。以下的代码具备实用性,包括函数,参数。这里还将介绍函数mouse_event需要用的应用程序用来合成鼠标事件。
- using System;
- using System.Runtime.InteropServices;
- using System.Text;
- namespace ConsoleApplication8{
- class Class1{
- [STAThread]
- static void Main(string[] args){
- // Display current status of keys.
- Console.WriteLine(
- "**BEFORE**/r/nCAP: {0}/r/nSCR: {1}/r/nNUM: {2}",
- Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",
- Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",
- Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"
- );
- // Toggle all the keys:
- Keyboard.SetState(
- VirtualKeys.VK_CAPITAL,
- !Keyboard.GetState(VirtualKeys.VK_CAPITAL)
- );
- Keyboard.SetState(
- VirtualKeys.VK_SCROLL,
- !Keyboard.GetState(VirtualKeys.VK_SCROLL)
- );
- Keyboard.SetState(
- VirtualKeys.VK_NUMLOCK,
- !Keyboard.GetState(VirtualKeys.VK_NUMLOCK)
- );
- // Display new status of keys.
- Console.WriteLine(
- "/r/n**AFTER**/r/nCAP: {0}/r/nSCR: {1}/r/nNUM: {2}",
- Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",
- Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",
- Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"
- );
- Console.ReadLine();
- }
- }
- public enum VirtualKeys: byte{
- VK_NUMLOCK = 0x90,
- VK_SCROLL = 0x91,
- VK_CAPITAL = 0x14
- }
- 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 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
- );
- }
- }
- }
- }
- ----------------------------------------------------------
- using System;
- using System.Drawing;
- using System.Collections;
- using System.ComponentModel;
- using System.Windows.Forms;
- using System.Data;
- namespace Example107_模拟鼠标
- {
- ///
- /// Form1 的摘要说明。
- ///
- public class Form1 : System.Windows.Forms.Form
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.Container components = null;
- public Form1()
- {
- //
- // Windows 窗体设计器支持所必需的
- //
- InitializeComponent();
- //
- // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
- //
- }
- ///
- /// 清理所有正在使用的资源。
- ///
- protected override void Dispose( bool disposing )
- {
- if( disposing )
- {
- if (components != null)
- {
- components.Dispose();
- }
- }
- base.Dispose( disposing );
- }
- #region Windows Form Designer generated code
- ///
- /// 设计器支持所需的方法 - 不要使用代码编辑器修改
- /// 此方法的内容。
- ///
- private void InitializeComponent()
- {
- this.button1 = new System.Windows.Forms.Button();
- this.SuspendLayout();
- //
- // button1
- //
- this.button1.Location = new System.Drawing.Point(144, 176);
- this.button1.Name = "button1";
- this.button1.TabIndex = 0;
- this.button1.Text = "Mouse";
- this.button1.Click += new System.EventHandler(this.button1_Click);
- //
- // Form1
- //
- this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
- this.ClientSize = new System.Drawing.Size(280, 237);
- this.Controls.AddRange(new System.Windows.Forms.Control[] {
- this.button1});
- this.Name = "Form1";
- this.Text = "Form1";
- this.DoubleClick += new System.EventHandler(this.Form1_DoubleClick);
- this.ResumeLayout(false);
- }
- #endregion
- ///
- /// 应用程序的主入口点。
- ///
- [STAThread]
- static void Main()
- {
- Application.Run(new Form1());
- }
- private System.Windows.Forms.Button button1;
- [System.Runtime.InteropServices.DllImport("user32")]
- private static extern int mouse_event(int dwFlags,int dx,int dy, int cButtons, int dwExtraInfo);
- const int MOUSEEVENTF_MOVE = 0x0001;
- const int MOUSEEVENTF_LEFTDOWN = 0x0002;
- const int MOUSEEVENTF_LEFTUP = 0x0004;
- const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
- const int MOUSEEVENTF_RIGHTUP = 0x0010;
- const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
- const int MOUSEEVENTF_MIDDLEUP = 0x0040;
- const int MOUSEEVENTF_ABSOLUTE = 0x8000;
- private void Form1_DoubleClick(object sender, System.EventArgs e)
- {
- MessageBox.Show("Double Click");
- }
- private void button1_Click(object sender, System.EventArgs e)
- {
- mouse_event(MOUSEEVENTF_MOVE,100,100,0,0);
- //下面是模拟双击的
- //mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
- //mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
- //mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
- //mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
- }
- }
- }
----------------------------------------------------------
mouse_event函数说明:
dwFlags -------- Long,下述标志的一个组合
MOUSEEVENTF_ABSOLUTE
dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元 - MOUSEEVENTF_MOVE
移动鼠标
MOUSEEVENTF_LEFTDOWN
模拟鼠标左键按下
MOUSEEVENTF_LEFTUP
模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN
模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP
模拟鼠标右键按下
MOUSEEVENTF_MIDDLEDOWN
模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP
模拟鼠标中键按下
dx
Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
dy ------------- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
cButtons ------- Long,未使用
dwExtraInfo ---- Long,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
函数功能:该函数综合鼠标击键和鼠标动作。
函数原型:VOID mouse_event(DWORD dwFlags,DWORD dx,DWORD dwFlags,OWORD dx,DWORD dy, DWORD dwData, DWORD dwExtralnfo);
参数:
dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:
MOOSE_EVENTF_ABSOLOTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。
MOOSEEVENTFMOVE:表明发生移动。
M00SEEVENTF_LEFTDOWN:表明接按下鼠标左键。
M00SEEVENTF_LEFTUP:表明松开鼠标左键。
MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。
MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。
MOOSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。
dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLOTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。
dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。
dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。
如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应为零。
dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtrajnfo来获得此附加信息。
返回值:无。
备注:如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。
如果指定了MOWSEEVENTF_ABSOLOTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标(0,0)映射到显示表面的左上角,(6553,65535)映射到右下角。
如果没指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。
鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数SystemParameterslnfo来取得和设置这些值。
在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿 X轴或y轴的相对位移加到4倍。
一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。
函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息,并保存到一个队列中。DLL然后调用 mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用 DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。
Windows CE:Windows CE不支持参数 dwFlags取MOOSE EVENTF WHEEL常数。
速查: Windows NT: 3.1及以上版本; Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;输入库:user32.lib。
【编辑推荐】