關于windows API 的鍵鼠可控可測

相關函數解釋

GetAsyncKeyState 是 Windows API 中的一個函數,用于判斷某個虛擬鍵是否被按下。GetAsyncKeyState(VK_ESCAPE) 專門用于檢測 Esc 鍵的狀態。下面為你詳細介紹其用法:

函數原型

cpp

SHORT GetAsyncKeyState(

? int vKey

);

參數

vKey:虛擬鍵碼,對于 Esc 鍵,使用 VK_ESCAPE 作為參數。

返回值

返回一個 SHORT 類型的值,其含義如下:

最高位(第 15 位)為 1 時,表示該鍵當前處于按下狀態;為 0 時,表示該鍵當前處于釋放狀態。

最低位(第 0 位)為 1 時,表示該鍵在最近一次調用 GetAsyncKeyState 之后被按下過;為 0 時,表示該鍵在最近一次調用之后沒有被按下過。

示例代碼

以下是一個簡單的 C++ 示例,展示了如何使用 GetAsyncKeyState(VK_ESCAPE) 來檢測 Esc 鍵的狀態:

cpp

#include <iostream>

#include <windows.h>

int main() {std::cout << "Press the Esc key to exit..." << std::endl;while (true) {// 檢測 Esc 鍵的狀態SHORT state = GetAsyncKeyState(VK_ESCAPE);// 檢查最高位是否為 1,即 Esc 鍵是否被按下if (state & 0x8000) {std::cout << "Esc key is pressed. Exiting..." << std::endl;break;}// 可以在這里添加其他代碼,處理其他任務Sleep(10); // 短暫休眠,減少 CPU 占用}return 0;}

代碼解釋

引入必要的頭文件:windows.h 包含了 GetAsyncKeyState 函數的聲明,iostream 用于輸入輸出操作。

進入循環:在 while (true) 循環中不斷檢測 Esc 鍵的狀態。

檢測 Esc 鍵狀態:調用 GetAsyncKeyState(VK_ESCAPE) 函數獲取 Esc 鍵的狀態,并將結果存儲在 state 變量中。

檢查最高位:使用按位與運算符 & 檢查 state 的最高位是否為 1。如果為 1,則表示 Esc 鍵被按下,輸出提示信息并退出循環。

短暫休眠:使用 Sleep(10) 函數讓程序暫停 10 毫秒,減少 CPU 占用。

注意事項

GetAsyncKeyState 是異步的,它返回的是調用時鍵的狀態,而不是在某個特定消息處理過程中的狀態。

由于該函數是異步的,可能會出現按鍵抖動的問題。在實際應用中,可以根據需要添加防抖處理。

虛擬鍵碼 ?對應值 對應鍵

對應鍵值

VK_LBUTTON ?1 鼠標左鍵VK_RBUTTON ?2 鼠標右鍵VK_CANCEL 3 CancelVK_MBUTTON ?4 鼠標中鍵VK_XBUTTON1 5VK_XBUTTON2 6VK_BACK 8 BackspaceVK_TAB ?9 TabVK_CLEAR ?12 ?Clear13 ?EnterVK_SHIFT ?16 ?ShiftVK_CONTROL ?17 ?CtrlVK_MENU 18 ?AltVK_PAUSE ?19 ?PauseVK_CAPITAL ?20 ?Caps LockVK_KANA 21 ?VK_HANGUL 21 ?VK_JUNJA ?23 ?VK_FINAL ?24 ?VK_HANJA ?25 ?VK_KANJI ?25*VK_ESCAPE 27 ?EscVK_CONVERT ?28 ?VK_NONCONVERT 29 ?VK_ACCEPT 30 ?VK_MODECHANGE 31 ?VK_SPACE ?32 ?SpaceVK_PRIOR ?33 ?Page UpVK_NEXT 34 ?Page DownVK_END ?35 ?EndVK_HOME 36 ?HomeVK_LEFT 37 ?Left ArrowVK_UP 38 ?Up ArrowVK_RIGHT ?39 ?Right ArrowVK_DOWN 40 ?Down ArrowVK_SELECT 41 ?SelectVK_PRINT ?42 ?PrintVK_EXECUTE ?43 ?ExecuteVK_SNAPSHOT 44 ?SnapshotVK_INSERT 45 ?InsertVK_DELETE 46 ?DeleteVK_HELP 47 ?Help48 ?049 ?150 ?251 ?352 ?453 ?554 ?655 ?756 ?857 ?965 ?A66 ?B67 ?C68 ?D69 ?E70 ?F71 ?G72 ?H73 ?I74 ?J75 ?K76 ?L77 ?M78 ?N79 ?O80 ?P81 ?Q82 ?R83 ?S84 ?T85 ?U86 ?V87 ?W88 ?X89 ?Y90 ?ZVK_LWIN 91 ?VK_RWIN 92 ?VK_APPS 93 ?VK_SLEEP ?95 ?VK_NUMPAD0 ?96 ?小鍵盤 0VK_NUMPAD1 ?97 ?小鍵盤 1VK_NUMPAD2 ?98 ?小鍵盤 2VK_NUMPAD3 ?99 ?小鍵盤 3VK_NUMPAD4 ?100 小鍵盤 4VK_NUMPAD5 ?101 小鍵盤 5VK_NUMPAD6 ?102 小鍵盤 6VK_NUMPAD7 ?103 小鍵盤 7VK_NUMPAD8 ?104 小鍵盤 8VK_NUMPAD9 ?105 小鍵盤 9VK_MULTIPLY 106 小鍵盤 *VK_ADD ?107 小鍵盤 +VK_SEPARATOR ?108 小鍵盤 EnterVK_SUBTRACT 109 小鍵盤 -VK_DECIMAL ?110 小鍵盤 .VK_DIVIDE 111 小鍵盤 /VK_F1 112 F1VK_F2 113 F2VK_F3 114 F3VK_F4 115 F4VK_F5 116 F5VK_F6 117 F6VK_F7 118 F7VK_F8 119 F8VK_F9 120 F9VK_F10 ?121 F10VK_F11 ?122 F11VK_F12 ?123 F12VK_F13 ?124VK_F14 ?125VK_F15 ?126VK_F16 ?127VK_F17 ?128VK_F18 ?129VK_F19 ?130VK_F20 ?131VK_F21 ?132VK_F22 ?133VK_F23 ?134VK_F24 ?135VK_NUMLOCK ?144 Num LockVK_SCROLL 145 ScrollVK_LSHIFT 160VK_RSHIFT 161VK_LCONTROL 162VK_RCONTROL 163VK_LMENU ?164VK_RMENU ?165VK_BROWSER_BACK 166VK_BROWSER_FORWARD ?167VK_BROWSER_REFRESH ?168VK_BROWSER_STOP 169VK_BROWSER_SEARCH 170VK_BROWSER_FAVORITES ?171VK_BROWSER_HOME 172VK_VOLUME_MUTE ?173 VolumeMuteVK_VOLUME_DOWN ?174 VolumeDownVK_VOLUME_UP ?175 VolumeUpVK_MEDIA_NEXT_TRACK 176VK_MEDIA_PREV_TRACK 177VK_MEDIA_STOP 178VK_MEDIA_PLAY_PAUSE 179VK_LAUNCH_MAIL ?180VK_LAUNCH_MEDIA_SELECT ?181VK_LAUNCH_APP1 ?182VK_LAUNCH_APP2 ?183VK_OEM_1 ?186 ; :VK_OEM_PLUS 187 = +VK_OEM_COMMA ?188VK_OEM_MINUS ?189 - _VK_OEM_PERIOD 190VK_OEM_2 ?191 / ?VK_OEM_3 ?192 ` ~VK_OEM_4 ?219 [ {VK_OEM_5 ?220 \VK_OEM_6 ?221 ] }VK_OEM_7 ?222 引號VK_OEM_8 ?223VK_OEM_102 ?226VK_PACKET 231VK_PROCESSKEY 229VK_ATTN 246VK_CRSEL ?247VK_EXSEL ?248VK_EREOF ?249VK_PLAY 250VK_ZOOM 251VK_NONAME 252VK_PA1 ?253VK_OEM_CLEAR ?254

代碼塊

模擬按鍵而實際使用模擬按鍵只需按下和放下(有時需要在這兩個操作之中放入延時)#include<stdio.h>;#include<windows.h>keybd_event(122, 0, 0, 0);keybd_event(122, 0, KEYEVENTF_KEYUP, 0);組合鍵keybd_event(VK_LWIN, 0, 0 ,0);keybd_event('R', 0, 0 ,0);keybd_event('R', 0, KEYEVENTF_KEYUP ,0);keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);以及上述這四行用于win + 各種鍵的組合鍵!!

鼠標操作

POINT p;

? SetCursorPos(1577, 346);

? mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

鼠標滑動操作

#include <windows.h>#include <stdio.h>#include<unistd.h>#include<conio.h>#include <math.h>int zx(int x1,int y1,int x2,int y2){POINT p;int x;SetConsoleTitle("5082.txt");usleep(200000);SetCursorPos(x1, y1);mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);usleep(200000);SetCursorPos(x2,y2);mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);}int main(){zx(1577,346,1125,685);zx(1135,304,1557,801);return 0;}

若keybd_event函數已被系統棄用,則使用SendInput函數

SendInput 函數是 Windows API 中的一個重要函數,用于模擬用戶輸入事件,包括鍵盤和鼠標操作。它比舊的 keybd_event 和 mouse_event 函數更強大、更可靠,并且在現代 Windows 系統中被推薦使用。下面將對 SendInput 函數進行詳細介紹。

函數原型

c

UINT SendInput(

? UINT ? ?cInputs,

? LPINPUT pInputs,

? int ? ? cbSize

);

參數說明

cInputs

類型:UINT

描述:pInputs 數組中 INPUT 結構體的數量,即要模擬的輸入事件的數量。

pInputs

類型:LPINPUT(指向 INPUT 結構體數組的指針)

描述:一個指向 INPUT 結構體數組的指針,每個 INPUT 結構體代表一個輸入事件,如鍵盤按鍵、鼠標移動或鼠標點擊等。

cbSize

類型:int

描述:INPUT 結構體的大小,通常使用 sizeof(INPUT) 來獲取。

返回值

類型:UINT

描述:函數返回實際插入到輸入隊列中的輸入事件的數量。如果返回值與 cInputs 不相等,則表示出現了錯誤。可以使用 GetLastError 函數來獲取具體的錯誤代碼。

INPUT 結構體

INPUT 結構體用于描述一個輸入事件,其定義如下:

c

typedef struct tagINPUT {

? DWORD type;

? union {

? ? MOUSEINPUT ? ?mi;

? ? KEYBDINPUT ? ?ki;

? ? HARDWAREINPUT hi;

? };

} INPUT, *PINPUT, *LPINPUT;

type:指定輸入事件的類型,可以是以下值之一:

INPUT_MOUSE:表示鼠標事件。

INPUT_KEYBOARD:表示鍵盤事件。

INPUT_HARDWARE:表示硬件事件,通常很少使用。

聯合部分:根據 type 的值,使用不同的結構體來描述具體的輸入事件。

MOUSEINPUT:用于描述鼠標事件,如鼠標移動、鼠標點擊等。

KEYBDINPUT:用于描述鍵盤事件,如按鍵按下、按鍵釋放等。

HARDWAREINPUT:用于描述硬件事件。

示例代碼

模擬鍵盤按鍵

c

#include <windows.h>

#include <stdio.h>

重點就在于這兩個函數的使用

// 模擬按鍵按下

// 模擬按鍵按下

void pressKey(WORD keyCode) {INPUT input = {0};input.type = INPUT_KEYBOARD;input.ki.wVk = keyCode;SendInput(1, &input, sizeof(INPUT));}// 模擬按鍵釋放void releaseKey(WORD keyCode) {INPUT input = {0};input.type = INPUT_KEYBOARD;input.ki.wVk = keyCode;input.ki.dwFlags = KEYEVENTF_KEYUP;SendInput(1, &input, sizeof(INPUT));}int main() {// 按下 'A' 鍵pressKey('A');// 等待一段時間Sleep(500);// 釋放 'A' 鍵releaseKey('A');return 0;}模擬鼠標點擊c#include <windows.h>#include <stdio.h>int main() {INPUT input = {0};input.type = INPUT_MOUSE;input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;// 按下鼠標左鍵SendInput(1, &input, sizeof(INPUT));Sleep(500);input.mi.dwFlags = MOUSEEVENTF_LEFTUP;// 釋放鼠標左鍵SendInput(1, &input, sizeof(INPUT));return 0;}

注意事項

權限問題:在某些情況下,模擬輸入事件可能需要管理員權限,特別是在系統受保護的區域或應用程序中。

兼容性:SendInput 函數在現代 Windows 系統中具有良好的兼容性,但在一些特殊環境或虛擬機中可能會受到限制。

錯誤處理:在使用 SendInput 函數時,建議檢查返回值并使用 GetLastError 函數來處理可能的錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vs 安裝完番茄助手visual assist 后 菜單欄不顯示

vs 安裝完番茄助手visual assist 后 菜單欄不顯示 出現原因解決辦法&#xff1a; 出現原因 vs安裝完番茄助手后&#xff0c;不顯示。主要原因是之前安裝過&#xff0c;但是試用過期了&#xff0c;卸載后重新安裝然后替換破解版的dll 導致的。 解決辦法&#xff1a; 關閉vs軟件…

論文導讀 - 基于邊緣計算、集成學習與傳感器集群的便攜式電子鼻系統

基于邊緣計算、集成學習與傳感器集群的便攜式電子鼻系統 原論文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0925400522015684 引用此論文&#xff08;GB/T 7714-2015&#xff09;&#xff1a; WANG T, WU Y, ZHANG Y, et al. Portable electr…

EasyCVR視頻匯聚平臺助力大型生產監控項目攝像機選型與應用

一、方案背景 在300路大型生產監控項目中&#xff0c;由于生產環境復雜多樣&#xff0c;涵蓋室外廠區、大型車間、室內辦公區域等不同場景&#xff0c;單一類型的攝像機難以滿足全方位、精細化的監控需求。EasyCVR作為一款功能強大的視頻融合管理平臺&#xff0c;具備靈活的視…

測試用例介紹

文章目錄 一、測試用例基本概念1.1 測試用例基本要素 二、測試用例的設計方法2.1 基于需求的設計方法2.2 等價類2.3 邊界值2.4 錯誤猜測法2.6 場景設計法2.7 因果圖2.5 正交排列 三、綜合&#xff1a;根據某個場景去設計測試用例&#xff08;萬能公式&#xff09;四、如何使用F…

基于藍牙Beacon人員導航方案

基于藍牙Beacon人員導航方案 一、室內定位市場痛點與技術選擇 大型商場&#xff08;單層超2萬㎡&#xff09;和醫院&#xff08;科室超200個&#xff09;的復雜空間中&#xff0c;傳統GPS信號衰減超90%&#xff0c;用戶平均尋路耗時10-15分鐘&#xff0c;30%購物決策因“找店…

使用vue3 腳手架創建項目

1.創建項目 并 運行 1.1 創建項目 vue create abcd 1.2 運行 創建好項目后&#xff0c;命令行會提示你運行項目 npm run serve 2.介紹各個目錄 node_modules : 項目依賴包&#xff0c;其中包括很多基礎依賴&#xff0c;自己也可以根據需要安裝其他依賴 assets文件夾&a…

跨語言哈希一致性:C# 與 Java 的 MD5 之戰?

在跨平臺或異構系統集成的場景中&#xff0c;我們經常需要在不同的編程語言之間交換數據或驗證數據一致性。MD5 作為一種廣泛使用的哈希算法&#xff0c;就常常扮演著生成唯一標識或校驗數據完整性的角色。然而&#xff0c;不少開發者可能會遇到這樣一個令人困惑的問題&#xf…

基于RuoYi的WMS倉庫管理系統源碼級解決方案

基于RuoYi的WMS倉庫管理系統源碼級解決方案 項目地址 一、系統簡介 WMS&#xff08;Warehouse Management System&#xff09;倉儲管理系統是現代物流管理的核心系統&#xff0c;通過對倉庫業務的精細化管理&#xff0c;實現入庫、出庫、庫存等環節的高度自動化和智能化。 系…

研究:大模型輸出一致性:確定性與隨機性的場景化平衡

大模型在相同輸入下的輸出是否一致,本質上取決于其設計目標、任務性質以及技術實現方式。這一問題需要從技術原理、應用場景、用戶需求三個維度進行深度分析: 一、技術實現:確定性與隨機性的平衡 模型架構的確定性基礎 大模型的核心參數(如權重矩陣)在訓練完成后是固定的…

青年座談會的讀書匯報

今天&#xff0c;單位組織了一個五四青年座談會&#xff0c;我們室由于大家都在出差忙之類的&#xff0c;我必須要參加&#xff0c;還要我做一個匯報&#xff0c;我一新來的還沒深入到研發工作中&#xff0c;于是決定寫了一篇簡單的讀書筆記&#xff0c;再用deepseek潤色一下&a…

RabbitMQ安裝流程(Windows環境)

安裝資料鏈接&#xff1a;https://download.csdn.net/download/ly1h1/90705840?spm1001.2014.3001.5503 代碼案例鏈接&#xff1a;https://download.csdn.net/download/ly1h1/90706521 1.下載依賴&#xff0c;Downloads - Erlang/OTP 2.下載RabbitMQ安裝包&#xff0c;In…

vscode 使用gitcode團隊管理項目

1、下載安裝vscode https://code.visualstudio.com/Download 2、安裝git 3、在vscode中安裝GitLens插件 4、打開終端 點擊會顯示當前更改的項目 5、提交更改的文件&#xff0c;會提示輸入用戶名、密碼&#xff0c;這里的密碼即是令牌&#xff0c;令牌在第一次創建的時候顯…

el-input限制輸入只能是數字 限制input只能輸入數字

方法一&#xff1a; 通過設置type屬性&#xff1a;type“number”&#xff0c;這種方式一般會影響樣式&#xff0c;不建議使用&#xff0c;如下圖&#xff1a; <el-input type"number" v-model"aaa"></el-input>方法二&#xff1a; 通過綁定值…

【Python數據驅動決策】數據分析與可視化全流程實戰指南

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比二、實戰演示環境配置要求核心代碼實現案例1:銷售數據清洗案例2:月度銷售趨勢分析案例3:產品關聯分析(熱力圖)運行結果驗證三、性能對…

Spring的BeanFactory和FactoryBean的區別

? ?BeanFactory和FactoryBean在Spring框架中扮演著不同的角色&#xff0c;具有不同的功能和用途。? 定義與角色 ?BeanFactory?&#xff1a;BeanFactory是Spring IoC容器的核心接口&#xff0c;用于管理和維護Bean的定義、創建和生命周期。它是Spring IoC容器的基礎&…

Typecho博客使用阿里云cdn和oss:handsome主題進階版

Typecho使用阿里云cdn和oss 設置前需要保證阿里云cdn和oss已配置好且可以正常使用一、準備工作二、修改 Handsome 主題的靜態資源鏈接方法 1&#xff1a;直接修改主題文件&#xff08;推薦&#xff09;方法 2&#xff1a;通過主題設置自定義&#xff08;方便&#xff09; 三、處…

部署mongodb三幅本集群

背景&#xff1a;原先使用的mongodb采用的是SSPL協議&#xff0c;此協議客戶檢測到有bug&#xff0c;故需要替換mongodb的版本&#xff0c;原先采用helm部署的mongodb但是無法找到4.1.4版本的chart包&#xff0c;故手寫yaml部署 1、部署mongodb-arbiter服務 這個服務是用來選…

jdk1.8.0_05 在 SpringBootTest Debug模式下奔潰

之前好好的項目&#xff0c;最近換了之前的電腦&#xff0c;但是在使用SpringBootTest 啟動debug模式時&#xff0c;虛擬機就會奔潰&#xff0c;通過修改如果把 junit5 import org.junit.jupiter.api.Test; 修改為 junit4 ,就不奔潰了 import org.junit.Test; 但是這樣的…

QGIS+mcp的安裝和使用

QGISmcp的安裝和使用 安裝qgis_mcp 下載qgis_mcp&#xff1a; git clone https://github.com/jjsantos01/qgis_mcp.git安裝uv uv是一個由Rust語言編寫的python包管理工具&#xff0c;旨在提供比傳統工具&#xff08;如 pip&#xff09;更高效的依賴管理和虛擬環境操作。 p…

厚銅pcb生產廠家哪家好?

在為您的項目選擇厚銅PCB供應商時&#xff0c;技術實力、生產經驗與交付能力是決定產品可靠性的關鍵。隨著新能源汽車、工業電源、5G通信等領域對高電流承載、高效散熱的需求激增&#xff0c;厚銅PCB&#xff08;銅厚3oz以上&#xff09;的工藝門檻不斷提升。本文結合行業頭部企…