20191223同時檢測多個按鍵和按鍵平滑處理

2021-10-01 16:12:44 字數 2473 閱讀 8722

getch() 函式,用於返回使用者輸入的字元。當連續按鍵時,該函式返回第乙個字元和第二個字元之間,預設有 0.5 秒的延時,並且之後的連續字元,預設是每秒鐘 15 次輸入。這兩個數值可以在控制面板中設定。

如果需要平滑的按鍵輸入,或者同時按下多個按鍵,就不能用 getch() 了,需要使用另乙個 windows api 函式:getasynckeystate()。該函式原型如下:

short getasynckeystate

(int vkey // virtual-key code

);

vkey 是要檢測的按鍵的虛擬鍵碼,常用的如 vk_up、vk_down 等,分別表示方向鍵的上、下等。需要注意:對於 26 個字母的鍵碼,可以直接寫 『a』、『b』……,而不要寫 vk_a、vk_b。數字鍵也是,請直接寫 『0』、『1』……。全部的 256 種虛擬鍵碼,請參考 msdn 中的 virtual-key codes。

返回的 short 值,如果最高位為 1,表示該鍵被按下;否則表示該鍵彈起。該函式的最低位還可以用來檢測開關鍵(比如大小寫鎖定鍵)的狀態。作為按鍵處理,還可以使用 getkeystate、getkeyboardstate 等函式,詳細請參考 msdn 手冊中的 keyboard input functions 部分。

下面給乙個簡單的例子,該範例是用鍵盤的上下左右鍵移動乙個圓,並且可以通過左 shift 放大、左 ctrl 縮小,幾個按鍵可以同時靈活地控制圓。**如下:

// 程式名稱:同時檢測多個按鍵及平滑按鍵輸入的範例

// 編譯環境:visual c++ 6.0 / 2010,easyx 驚蟄版

//#include

/// 定義常量、列舉量、結構體、全域性變數

/#define cmd_up 1

#define cmd_down 2

#define cmd_left 4

#define cmd_right 8

#define cmd_zoomin 16

#define cmd_zoomout 32

#define cmd_quit 64

// 宣告圓的座標和半徑

int g_x, g_y, g_r;

/// 函式宣告

/void

init()

;// 初始化

void

quit()

;// 退出

intgetcommand()

;// 獲取控制命令

void

dispatchcommand

(int _cmd)

;// 分發控制命令

void

onup()

;// 上移

void

ondown()

;// 下移

void

onleft()

;// 左移

void

onright()

;// 右移

void

onzoomin()

;// 放大

void

onzoomout()

;// 縮小

/// 函式定義

/// 主函式

void

main()

while(!

(c & cmd_quit));

quit()

;}// 初始化

void

init()

// 退出

void

quit()

// 獲取控制命令

intgetcommand()

// 分發控制命令

void

dispatchcommand

(int _cmd)

// 上移

void

onup()

// 下移

void

ondown()

// 左移

void

onleft()

// 右移

void

onright()

// 放大

void

onzoomin()

// 縮小

void

onzoomout()

再額外說乙個小問題:由於 getasynckeystate() 函式獲取的按鍵狀態是直接取自硬體,並非取自訊息佇列。所以,即便程式處非活動狀態,getasynckeystate() 仍然可以正確獲取按鍵狀態。所以會有這樣乙個問題:比如你寫了乙個打字練習的小遊戲,在遊戲中途切換到另乙個應用去發郵件,你會看到發郵件錄入文字時,你的打字練習小遊戲仍然會接受鍵盤輸入。很明顯,這時候需要判當前應用是否處於活動狀態。解決方法有多種,例如,通過 windows api 函式 getforegroundwindow() 獲取到當前前景視窗的控制代碼,再和 easyx 視窗的控制代碼對比,如果相同,就表示 easyx 的視窗處於活動狀態,從而解決非活動狀態的按鍵處理問題。

同時啟動多個Tomcat

一台pc機上同時啟動多個tomcat 環境 兩個tomcat7.0.20,使用乙個jvm,jdk7,win7 64位系統。系統環境變數裡的catalina home已經刪除,根據catalina.bat裡的 來看,應該走的是自己設定的臨時環境變數。兩個startup.bat最前面加上一句set ca...

同時開啟多個軟體

有時候我們開啟幾個常用的軟體,還在乙個乙個開啟嗎?下面教你一招 1 建立乙個.bat檔案 2 輸入以下內容 open some software echo off start title d program files x86 tencent qq bin qqsclauncher.exe star...

同時啟動多個Tomcat

tomcat是個服務程式,需要占用幾個通訊埠,所以預設情況是不能啟動多個tomcat,如果要啟動多個tomcat,需要修改配置檔案,通過在配置檔案設定不同的通訊埠就可以做到.檔案 tomcat home conf server.xml 是tomcat服務配置檔案,裡面有很多配置項,本文只關注怎麼修改...