[英]Complex keyboard input to child process in C, Linux
一段時間以來,我一直在嘗試解決這個問題,但我無法提出解決方案。 我需要一個子進程來理解復雜的 WASD 鍵盤輸入(復雜的意思是檢測同時按下 W 和 A 或許多其他鍵)但我認為由於字符的讀取方式,這在 C 中是不可能的從終端。 我的父進程只有最好的結果(取自另一篇文章)如下:
int kbhit(){
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &fds);
}
int main(){
system("stty raw -echo"); //No need to newline to read key and disables showing pressed key
char command;
unsigned short count = 0;
while(1){
while(1){
if(kbhit()){count = 0; command = getchar(); break;}
if(count > 5) {count = 0; command = 'f'; break;}
count++;
//Add code to somehow wait a few milliseconds
}
//Use read key/command...
//If a certain key is read break out of loop
}
system("stty sane echo"); //Return terminal to normal state
return EXIT_SUCCESS;
}
這太“hacky”了,它沒有檢測到多個同時按下的按鍵,我需要一個子進程來讀取這些鍵,這段代碼在 fork 下不起作用,因為鍵盤被發送給父進程,孩子沒有新的標准輸入(我認為)。 由於我在其他地方做了很多低級的事情,我不能用另一種語言重寫我的整個程序。 我想到了以下解決方案,但我不確定 go 是哪一個:
還有其他更好的方法嗎? 選項 2 可行嗎? 我迷路了,被困住了,歡迎任何幫助!
最簡單的方法是創建事件。 例如
struct SKeyEvent
{
char key;
uint8_t pressed;
};
因此,當按下一個鍵時,您可以使用回調 function 來使用鍵和 0、1、2、1 和 2 更新結構。1 = 按下,2 = 釋放,然后立即跟隨 0 = 空閑。 所以當我按下 A 時,如果你按下 W 相同的 {'W', 1},那么 function 回調將通過 {key:'A', 1} 調用,這樣你就知道同時按下了 A 和 W。 釋放觸摸后,您將收到 2 個電話,例如 {'A': 2}, {'A':0}
我解決了這個問題,而不是通過讀取實際的鍵盤設備 (/dev/...) 從終端讀取字符(不起作用,因為您一次只能輸入一個字符...)。 周圍有一些這樣的例子。
缺點是它捕獲所有鍵盤輸入,您現在需要以超級用戶身份運行該程序,但它可以工作......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.