最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#采用mouse_event函數(shù)實(shí)現(xiàn)模擬鼠標(biāo)功能

 更新時間:2015年07月21日 15:40:27   作者:GC2013  
這篇文章主要介紹了C#模擬鼠標(biāo)點(diǎn)擊小功能,通過代碼向大家做分析,需要的朋友可以參考下

下面我通過代碼為大家分享下C#模擬鼠標(biāo),具體內(nèi)容如下:

想必有很多人在項(xiàng)目開發(fā)中可能遇見需要做模擬鼠標(biāo)點(diǎn)擊的小功能,很多人會在百度過后采用mouse_event這個函數(shù),不過我并不想討論如何去使用mouse_event函數(shù)怎么去使用,因?yàn)槟菦]有多大意義。

static void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo) 
{ 
 int x = dx, y = dy; 
 edit_position(dwFlags, dx, dy, ref x, ref y); 
 IntPtr hWndFromPoint = WindowFromPoint(x, y); 
 screen_to_client(hWndFromPoint, ref x, ref y); 
 send_message(hWndFromPoint, dwFlags, cButtons, x, y); 
} 

 
上述代碼你發(fā)現(xiàn)了什么?如果你發(fā)現(xiàn)說明你知道了本文到底在寫什么東東 說不定你會有一些興趣看下去,不過想到我如今混那么凄慘 在工地上做干活 不過也還好。

鼠標(biāo)點(diǎn)擊目標(biāo)時會向鼠標(biāo)所點(diǎn)擊目標(biāo)窗口投遞消息,根據(jù)鼠標(biāo)的按鍵、狀態(tài)不同會投遞不同的消息,一個完整的“鼠標(biāo)左鍵單擊”事件過程為“WM_LBUTTONDOWN +

WM_LBUTTONUP”即鼠標(biāo)“先左鍵按下 + 后左鍵抬起”,由于mouse_event可以模擬鼠標(biāo)點(diǎn)擊過程而不是直接性一次完整的鼠標(biāo)單擊過程,所以同樣存在“按下、抬起”

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP | MOUSEEVENTF_MOVE, -450, 0, 1, 0); 
mouse_event在沒有提供MOUSEEVENTF_MOVE量時光標(biāo)不會移動到相對位置,“光標(biāo)相對位置=光標(biāo)現(xiàn)行位置+新光標(biāo)位置”如果提供量“MOUSEEVENTF_ABSOLUTE”絕對位置,則會以“新光標(biāo)位置”為準(zhǔn)而不會添加“光標(biāo)現(xiàn)行位置”

static void edit_position(int dwFlags, int dx, int dy, ref int x, ref int y) 
{ 
 Point pos = MousePosition; 
 x = x + pos.X; 
 y = y + pos.Y; 
 if ((dwFlags | MOUSEEVENTF_ABSOLUTE) == dwFlags) 
  SetCursorPos(dx, dy); 
 if ((dwFlags | MOUSEEVENTF_MOVE) == dwFlags) 
  SetCursorPos(x, y); 
} 

edit_position函數(shù)主要用于對MOUSEEVENTF_MOVE于MOUSEEVENTF_ABSOLUTE

相對/絕對光標(biāo)位置修改的一個支持

static void send_message(IntPtr hWnd, int dwFlags, int cButtons, int x, int y) 
{ 
 if ((dwFlags | MOUSEEVENTF_LEFTDOWN) == dwFlags) 
  SendMessage(hWnd, WM_LBUTTONDOWN, cButtons, MakeDWord(x, y)); 
 if ((dwFlags | MOUSEEVENTF_LEFTUP) == dwFlags) 
  SendMessage(hWnd, WM_LBUTTONUP, cButtons, MakeDWord(x, y)); 
 if ((dwFlags | MOUSEEVENTF_RIGHTDOWN) == dwFlags) 
  SendMessage(hWnd, WM_RBUTTONDOWN, cButtons, MakeDWord(x, y)); 
 if ((dwFlags | MOUSEEVENTF_RIGHTUP) == dwFlags) 
  SendMessage(hWnd, WM_RBUTTONUP, cButtons, MakeDWord(x, y)); 
 if ((dwFlags | MOUSEEVENTF_MIDDLEDOWN) == dwFlags) 
  SendMessage(hWnd, WM_MBUTTONDOWN, cButtons, MakeDWord(x, y)); 
 if ((dwFlags | MOUSEEVENTF_MIDDLEUP) == dwFlags) 
  SendMessage(hWnd, WM_MBUTTONUP, cButtons, MakeDWord(x, y)); 
} 

 

send_message函數(shù)主要用于模擬鼠標(biāo)點(diǎn)擊的過程,上面我提到“先左鍵按下 + 后左鍵抬起”在上面的代碼中你會看的清楚的不得了,如果相反你可以去嘗試一番會有什么后果與其說

不如你們自己做更要來的快些。

static int MakeDWord(int low, int high) 
{ 
 return low + (high * Abs(~ushort.MaxValue)); 
} 
static int Abs(int value) 
{ 
 return ((value >> 31) ^ value) - (value >> 31); 
} 
MakeDWord / 合并整數(shù),函數(shù)主要是把兩個short合并為一個int,分為low、high兩部分
 
 
static bool screen_to_client(IntPtr hwnd, ref int x, ref int y) 
{ 
 bool bRetVal = false; 
 Point lpptPos = new Point(x, y); 
 if ((bRetVal = ScreenToClient(hwnd, ref lpptPos))) 
 { 
  x = lpptPos.X; 
  y = lpptPos.Y; 
 } 
 return bRetVal; 
} 
screen_to_client函數(shù)故名思意,它主要用于把屏幕上的坐標(biāo)轉(zhuǎn)換到窗口客戶上對應(yīng)坐標(biāo) 
public const int WM_LBUTTONDOWN = 513; // 鼠標(biāo)左鍵按下 
public const int WM_LBUTTONUP = 514; // 鼠標(biāo)左鍵抬起 
public const int WM_RBUTTONDOWN = 516; // 鼠標(biāo)右鍵按下 
public const int WM_RBUTTONUP = 517; // 鼠標(biāo)右鍵抬起 
public const int WM_MBUTTONDOWN = 519; // 鼠標(biāo)中鍵按下 
public const int WM_MBUTTONUP = 520; // 鼠標(biāo)中鍵抬起 
public const int MOUSEEVENTF_MOVE = 0x0001; // 移動鼠標(biāo)   
public const int MOUSEEVENTF_LEFTDOWN = 0x0002; // 鼠標(biāo)左鍵按下  
public const int MOUSEEVENTF_LEFTUP = 0x0004; // 鼠標(biāo)左鍵抬起  
public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; // 鼠標(biāo)右鍵按下  
public const int MOUSEEVENTF_RIGHTUP = 0x0010; // 鼠標(biāo)右鍵抬起   
public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; // 鼠標(biāo)中鍵按下 
public const int MOUSEEVENTF_MIDDLEUP = 0x0040; // 鼠標(biāo)中鍵抬起   
public const int MOUSEEVENTF_ABSOLUTE = 0x8000; // 絕對坐標(biāo) 


[DllImport("user32.dll", SetLastError = true)] 
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam); 
[DllImport("user32.dll", SetLastError = true)] 
public static extern IntPtr WindowFromPoint(int xPoint, int yPoint); 
[DllImport("user32.dll", SetLastError = true)] 
public static extern int SetCursorPos(int x, int y); 
[DllImport("user32.dll", SetLastError = true)] 
public static extern bool ScreenToClient(IntPtr hWnd, ref Point lppt); 
// [DllImport("user32", SetLastError = true)] 
// public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); 


鼠標(biāo)右鍵單擊(靜默):

復(fù)制代碼 代碼如下:

mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 1, 0); 

鼠標(biāo)左鍵雙擊(靜默):

復(fù)制代碼 代碼如下:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 2, 0); 

鼠標(biāo)移動(相對位置):

復(fù)制代碼 代碼如下:

mouse_event(MOUSEEVENTF_MOVE, 100, 50, 0, 0); 

鼠標(biāo)移動(絕對位置):

復(fù)制代碼 代碼如下:

mouse_event(MOUSEEVENTF_ABSOLUTE, 100, 50, 0, 0); 

以上內(nèi)容比較多請認(rèn)真學(xué)習(xí),希望能夠幫助到大家。

相關(guān)文章

  • C#封裝一個快速讀取寫入操作excel的工具類

    C#封裝一個快速讀取寫入操作excel的工具類

    這篇文章主要為大家詳細(xì)介紹了C#如何封裝一個快速讀取寫入操作excel的工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 基于C#實(shí)現(xiàn)Word加蓋的騎縫章效果

    基于C#實(shí)現(xiàn)Word加蓋的騎縫章效果

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)Word加蓋的騎縫章效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-01-01
  • C#中關(guān)于可空類型的小知識

    C#中關(guān)于可空類型的小知識

    這篇文章主要介紹了C#中關(guān)于可空類型的小知識,本文講解可空類型運(yùn)算的小技巧,需要的朋友可以參考下
    2015-04-04
  • C#集合之字典的用法

    C#集合之字典的用法

    這篇文章介紹了C#集合之字典的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C# String字符串案例詳解

    C# String字符串案例詳解

    這篇文章主要介紹了C# String字符串案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C#支付寶新版支付請求接口調(diào)用

    C#支付寶新版支付請求接口調(diào)用

    這篇文章主要為大家詳細(xì)介紹了C#支付寶新版支付請求接口調(diào)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 關(guān)于C#基礎(chǔ)知識回顧--反射(二)

    關(guān)于C#基礎(chǔ)知識回顧--反射(二)

    其實(shí)說白了,反射就是能知道我們未知類型的類型信息這么一個東西.沒什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運(yùn)行時得到類型信息
    2013-07-07
  • Jquery+Ajax+Json+存儲過程實(shí)現(xiàn)高效分頁

    Jquery+Ajax+Json+存儲過程實(shí)現(xiàn)高效分頁

    這篇文章主要介紹Jquery+Ajax+Json+存儲過程實(shí)現(xiàn)分頁,需要的朋友可以參考下
    2015-08-08
  • C#將List轉(zhuǎn)換為只讀的List方法與技巧

    C#將List轉(zhuǎn)換為只讀的List方法與技巧

    在 C# 編程的廣闊世界里,數(shù)據(jù)的安全性與穩(wěn)定性始終是我們關(guān)注的焦點(diǎn),當(dāng)涉及到集合數(shù)據(jù)的處理時,有時我們會面臨這樣一個關(guān)鍵需求:將List轉(zhuǎn)換為只讀的List,所以本文給大家介紹了使用C#將List轉(zhuǎn)換為只讀的List的方法與技巧,需要的朋友可以參考下
    2025-01-01
  • linq語法基礎(chǔ)使用示例

    linq語法基礎(chǔ)使用示例

    LINQ語言集成查詢(Language Integrated Query),是在.NET Framework 3.5 中出現(xiàn)的技術(shù),借助于LINQ技術(shù),我們可以使用一種類似SQL的語法來查詢?nèi)魏涡问降臄?shù)據(jù),下面學(xué)習(xí)一下他的使用方法
    2014-01-01

最新評論

莱芜市| 疏附县| 昌都县| 平遥县| 崇阳县| 枣阳市| 河北区| 敖汉旗| 孙吴县| 安义县| 黎川县| 临清市| 南部县| 汽车| 陇南市| 永城市| 洛扎县| 鄂州市| 湛江市| 济宁市| 萍乡市| 新密市| 吐鲁番市| 宜兰市| 遂平县| 远安县| 冕宁县| 怀远县| 北海市| 鄄城县| 长泰县| 溧水县| 昭苏县| 千阳县| 遵义县| 普兰县| 鄄城县| 福鼎市| 道孚县| 吴旗县| 曲靖市|