2016-06-15 26 views
0

我正在爲C語言製作PC的和聲合成器軟件,爲此我必須檢測多個按鍵和keyrelease,以便同時播放音符。所以,我認爲訪問鍵盤緩衝區會有所幫助。但我不知道如何。所以任何人都可以提出這樣做​​的方法或一些新的想法來檢測多個按鍵。用於檢測單按鍵和keyrelease我提出以下使用的kbhit(C代碼)和的getch()功能: -如何訪問PC鍵盤緩衝區以檢測多個按鍵和按鍵釋放?

#include<stdio.h> 
#include<stdlib.h> 
#include<conio.h> 
#include<time.h> 

void keypress(char); 
void delay(int); 

int flag=0; 

int main() 
{ 
    char c; 

    while(1) 
    { 
     if(kbhit()) 
     { 
      c=getch(); 

      printf("\nCharacter:%c",c); 

      getch(); 

      keypress(c); 

      printf("\nKey Released"); 

     } 
    } 

    return 0; 
} 

void keypress(char ch) 
{ 
    char c; 

    delay(50); 

    if(kbhit()) 
    { 
     c=getch(); 

     if(c==ch) 
     { 
      keypress(c); 
     } 

    } 
} 

void delay(int milliSeconds) 
{ 
    clock_t final_time = milliSeconds + clock(); 
    while (final_time > clock()); 
} 

但它有像一些問題: -

未檢測

1)。多按鍵

2)。它產生一個非常小的延遲

所以任何人可以建議的改進的代碼來解決上面的問題或用於檢測多個按鍵和鍵釋放了一些新的技術。平臺:-Windows 8.1

如果解決方案將平臺友好,這將是一件好事。

謝謝!

+0

你的意思是你想使用電腦鍵盤,如鋼琴鍵盤,同時持有幾個鍵?您可能會考慮WINAPI函數[GetKeyboardState](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v = vs.85).aspx) –

+1

這是DOS編程,不是視窗。 – Lundin

回答

1

這說明如何使用Windows的GetAsyncKeyState函數。它不需要在GUI中 - 該控制檯應用程序如圖所示工作。將由您來檢查位狀態標誌as documented以確定操作。例如,當按下一個鍵時,自動重複功能將被使用。你可能不需要檢查每個密鑰。

#include <stdio.h> 
#include <windows.h> 

int main(void) 
{ 
    unsigned short buff[256] = {0}; 
    unsigned short kval; 
    int i; 
    while (1) { 
     for(i=0; i<256; i++) { 
      kval = GetAsyncKeyState(i); 
      if(kval != buff[i]) { 
       printf("%02X:%04X ", i, kval); 
       buff[i] = kval; 
      } 
     } 
    } 
    return 0; 
} 

在此測試中,第一行是在按任意鍵之前輸出的。當我按下並釋放'A'時,輸出第二行。

0D:0001 26:0001 45:0001 53:0001 54:0001 0D:0000 26:0000 45:0000 53:0000 54:0000 
41:8001 41:8000 41:0000 

注:與user32.lib連接。

1

當您包含conio.h時,該解決方案已經綁定到Windows(或MS/DOS)平臺。

這裏,因爲我認爲你並不真的需要一個命令行程序,將打造具有事件循環,並直接處理WM_KEYDOWNWM_KEYUP消息的Windows GUI程序的最佳途徑儘快鍵被按下警報在鍵盤上發佈。爲避免丟失密鑰狀態中的任何更改的風險,您甚至可以一直使用API​​函數來加載鍵盤上所有密鑰的當前狀態。

我知道這是更準確的答案,但一個SO帖子的詳細答案會太長。