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_模擬鼠標(biāo)
{
/// <summary>
/// Form1 的摘要說明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必需的設(shè)計器變量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗體設(shè)計器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼
//
}
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// 設(shè)計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內(nèi)容。
/// </summary>
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
/// <summary>
/// 應(yīng)用程序的主入口點(diǎn)。
/// </summary>
[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函數(shù)說明:
dwFlags -------- Long,下述標(biāo)志的一個組合
MOUSEEVENTF_ABSOLUTE
dx和dy指定鼠標(biāo)坐標(biāo)系統(tǒng)中的一個絕對位置。在鼠標(biāo)坐標(biāo)系統(tǒng)中,屏幕在水平和垂直方向上均勻分割成65535×65535個單元 - MOUSEEVENTF_MOVE
移動鼠標(biāo)
MOUSEEVENTF_LEFTDOWN
模擬鼠標(biāo)左鍵按下
MOUSEEVENTF_LEFTUP
模擬鼠標(biāo)左鍵抬起
MOUSEEVENTF_RIGHTDOWN
模擬鼠標(biāo)右鍵按下
MOUSEEVENTF_RIGHTUP
模擬鼠標(biāo)右鍵按下
MOUSEEVENTF_MIDDLEDOWN
模擬鼠標(biāo)中鍵按下
MOUSEEVENTF_MIDDLEUP
模擬鼠標(biāo)中鍵按下
dx
Long,根據(jù)是否指定了MOUSEEVENTF_ABSOLUTE標(biāo)志,指定水平方向的絕對位置或相對運(yùn)動
dy ------------- Long,根據(jù)是否指定了MOUSEEVENTF_ABSOLUTE標(biāo)志,指定垂直方向的絕對位置或相對運(yùn)動
cButtons ------- Long,未使用
dwExtraInfo ---- Long,通常未用的一個值。用GetMessageExtraInfo函數(shù)可取得這個值?捎玫闹等Q于特定的驅(qū)動程序
函數(shù)功能:該函數(shù)綜合鼠標(biāo)擊鍵和鼠標(biāo)動作。
函數(shù)原型:VOID mouse_event(DWORD dwFlags,DWORD dx,DWORD dwFlags,OWORD dx,DWORD dy, DWORD dwData, DWORD dwExtralnfo);
參數(shù):
dwFlags:標(biāo)志位集,指定點(diǎn)擊按鈕和鼠標(biāo)動作的多種情況。此參數(shù)里的各位可以是下列值的任何合理組合:
MOOSE_EVENTF_ABSOLOTE:表明參數(shù)dX,dy含有規(guī)范化的絕對坐標(biāo)。如果不設(shè)置此位,參數(shù)含有相對數(shù)據(jù):相對于上次位置的改動位置。此標(biāo)志可被設(shè)置,也可不設(shè)置,不管鼠標(biāo)的類型或與系統(tǒng)相連的類似于鼠標(biāo)的設(shè)備的類型如何。要得到關(guān)于相對鼠標(biāo)動作的信息,參見下面?zhèn)渥⒉糠帧?
MOOSEEVENTFMOVE:表明發(fā)生移動。
M00SEEVENTF_LEFTDOWN:表明接按下鼠標(biāo)左鍵。
M00SEEVENTF_LEFTUP:表明松開鼠標(biāo)左鍵。
MOOSEEVENTF_RIGHTDOWN:表明按下鼠標(biāo)右鍵。
MOOSEEVENTF_RIGHTUP:表明松開鼠標(biāo)右鍵。
MOOSEEVENTF_MIDDLEDOWN:表明按下鼠標(biāo)中鍵。
MOOSEEVENTF_MIDDLEUP:表明松開鼠標(biāo)中鍵。
MOOSEEVENTF_WHEEL:在Windows NT中如果鼠標(biāo)有一個輪,表明鼠標(biāo)輪被移動。移動的數(shù)量由dwData給出。
dx:指定鼠標(biāo)沿x軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于MOOSEEVENTF_ABSOLOTE的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實(shí)際X坐標(biāo);給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。一個mickey表示鼠標(biāo)移動的數(shù)量,表明鼠標(biāo)已經(jīng)移動。
dy:指定鼠標(biāo)沿y軸的絕對位置或者從上次鼠標(biāo)事件產(chǎn)生以來移動的數(shù)量,依賴于MOOSEEVENTF_ABSOLVTE的設(shè)置。給出的絕對數(shù)據(jù)作為鼠標(biāo)的實(shí)際y坐標(biāo),給出的相對數(shù)據(jù)作為移動的mickeys數(shù)。
dwData:如果dwFlags為MOOSEEVENTF_WHEEL,則dwData指定鼠標(biāo)輪移動的數(shù)量。正值表明鼠標(biāo)輪向前轉(zhuǎn)動,即遠(yuǎn)離用戶的方向;負(fù)值表明鼠標(biāo)輪向后轉(zhuǎn)動,即朝向用戶。一個輪擊定義為WHEEL_DELTA,即120。
如果dwFlagsS不是MOOSEEVENTF_WHEEL,則dWData應(yīng)為零。
dwExtralnfo:指定與鼠標(biāo)事件相關(guān)的附加32位值。應(yīng)用程序調(diào)用函數(shù)GetMessgeExtrajnfo來獲得此附加信息。
返回值:無。
備注:如果鼠標(biāo)被移動,用設(shè)置MOUSEEVENTF_MOVE來表明,dX和dy保留移動的信息。給出的信息是絕對或相對整數(shù)值。
如果指定了MOWSEEVENTF_ABSOLOTE值,則dX和dy含有標(biāo)準(zhǔn)化的絕對坐標(biāo),其值在0到65535之間。事件程序?qū)⒋俗鴺?biāo)映射到顯示表面。坐標(biāo)(0,0)映射到顯示表面的左上角,(6553,65535)映射到右下角。
如果沒指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相對于上次鼠標(biāo)事件產(chǎn)生的位置(即上次報告的位置)的移動。正值表示鼠標(biāo)向右(或下)移動;負(fù)值表示鼠標(biāo)向左(或上)移動。
鼠標(biāo)的相對移動服從鼠標(biāo)速度和加速度等級的設(shè)置,一個最終用戶用鼠標(biāo)控制面板應(yīng)用程序來設(shè)置這些值,應(yīng)用程序用函數(shù)SystemParameterslnfo來取得和設(shè)置這些值。
在應(yīng)用加速時系統(tǒng)對指定相對鼠標(biāo)移動提供了兩個測試。如果指定的沿X軸y軸的距離比第一個鼠標(biāo)閾值大,并且鼠標(biāo)的加速等級非零,則操作系統(tǒng)將距離加倍。如果指定的沿X軸或y軸的距離比第二個鼠標(biāo)閾值大,并且鼠標(biāo)的加速等級為2,則操作系統(tǒng)將從第一個閾測試得來的距離加倍。這樣就允許操作系統(tǒng)將指定鼠標(biāo)沿X軸或y軸的相對位移加到4倍。
一旦應(yīng)用了加速,系統(tǒng)用期望的鼠標(biāo)速度換算合成的值。鼠標(biāo)速度的范圍是從1(最慢)到20(最快),并代表基于鼠標(biāo)移動的距離指示符移動的數(shù)量。缺省值是10,表示對鼠標(biāo)的移動設(shè)有附加的修改。
函數(shù)mouse_event需要用的應(yīng)用程序用來合成鼠標(biāo)事件。也被應(yīng)用程序用來取得鼠標(biāo)位置和鼠標(biāo)按鍵狀態(tài)之外的鼠標(biāo)信息。例如,如果輸入板制造商想將基于畫筆的信息傳給自己的應(yīng)用程序,可以寫一個直接與輸入板硬件通信的動態(tài)鍵接庫(DLL),獲得附加的信息,并保存到一個隊列中。DLL然后調(diào)用mouse_event,用標(biāo)準(zhǔn)按鍵和x/y位置數(shù)據(jù),并在參數(shù)dwExtralnfo設(shè)置排列的附加信息的指針或索引。當(dāng)應(yīng)用程序需要附加信息時,調(diào)用DLL(連同存貯在dwEXtralnfo中的指針或索引),則DLL返回附加信息。
Windows CE:Windows CE不支持參數(shù) dwFlags取MOOSE EVENTF WHEEL常數(shù)。
速查: Windows NT: 3.1及以上版本; Windows:95及以上版本;Windows CE:不支持;頭文件:winuser.h;輸入庫:user32.lib。
http://blog.csdn.net/cocosoft/archive/2004/09/23/114346.aspx
http://www.z4.cc/bbs/showthread.php?threadid=1809
http://www.devmanclub.com/ShowPost.aspx?PostID=8456
http://www.china-askpro.com/msg18/qa18.shtml
http://www.hongen.com/pc/program/apitutor/api0006/api01.htm