簡體   English   中英

C、Linux中子進程的復雜鍵盤輸入

[英]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 是哪一個:

  • 讓子進程使用系統(“xterm”)打開一個新終端並通過這個終端發送密鑰,這不能解決多個密鑰同時出現的問題,並且從我的第一次測試中我無法將這個新終端鏈接到正在運行的進程這個終端剛剛運行一個新的 bash session。代碼塊直到這個終端被關閉。
  • 使用另一種語言,如 c++ 或 java,它確實支持輕松讀取同時按鍵並以某種方式將其“管道”到子進程。 我猜孩子會分叉並讓另一個進程通過系統調用運行這個新代碼。 我不確定如何將其發送到其他進程(也許是套接字?)。

還有其他更好的方法嗎? 選項 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM