Guest User

Untitled

a guest
Dec 6th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <malloc.h>
  4. #include <Windows.h>
  5. #pragma comment(lib,"winmm.lib")
  6. int WaitPressKey(int,int);
  7. int WaitPressKeyEx(int,int,bool,...);
  8.  
  9. int main(void){
  10. int check = 0;
  11. printf("何らかのキーを押してください\n");
  12. WaitPressKey(-1,-1);
  13.  
  14. printf("Dキーを押してください\n");
  15. WaitPressKey('D',-1);
  16.  
  17. printf("Alt+Wを押してください\n");
  18. WaitPressKeyEx(2,-1,true,VK_MENU,'W');
  19.  
  20. printf("Enter(Return)キーかスペースキーを押してください\n");
  21. WaitPressKeyEx(2,-1,false,VK_RETURN,VK_SPACE);
  22.  
  23. printf("Ctrl + Shift + Nを押してください\n");
  24. WaitPressKeyEx(3,-1,true,VK_CONTROL , VK_SHIFT , 'N');
  25.  
  26. printf("ESCキーかF4キーかバックスペースキーを押してください\n");
  27. WaitPressKeyEx(3,-1,false,VK_ESCAPE,VK_F4,VK_BACK);
  28.  
  29. printf("Ctrl + Shift + Alt + F を押してください\n");
  30. WaitPressKeyEx(4,-1,true,VK_CONTROL , VK_SHIFT , VK_MENU, 'F');
  31.  
  32. printf("Alt + F2を押してください(タイムアウト:4秒)");
  33. check = WaitPressKeyEx(2,4000,true,VK_MENU,VK_F2);
  34. if(check == -2)printf("[timeout]\n"); else printf("\n");
  35.  
  36. printf("Ctrl + Shift + F5を押してください(タイムアウト:3秒)");
  37. check=WaitPressKeyEx(3,3000,true,VK_CONTROL , VK_SHIFT , VK_F5);
  38. if(check == -2)printf("[timeout]\n"); else printf("\n");
  39.  
  40.  
  41.  
  42. return 0;
  43. }
  44.  
  45. int WaitPressKey(int keyid,int timeout){
  46. int byteKeyState[256];
  47. int flag = 0 , i , retkey = keyid;
  48. int starttime;
  49. if(keyid >= 256)return -1;
  50.  
  51. timeBeginPeriod(1);
  52. starttime = timeGetTime();
  53. do{
  54. //キーボードの状態を取得
  55. for(i = 0 ; i < 256 ; i++)byteKeyState[i] = GetAsyncKeyState(i) & 0x8000;
  56.  
  57. //確認
  58. if(keyid == -1){
  59. //引数で確認すべきキーコードが-1(全て対象)と指定されてる時
  60. //全てのデータをチェックして押されてるものがあったらflagを1にして
  61. //forループを抜ける(OEMのコードは除く)
  62. for(i = 0 ; i < 256 ; i++){
  63. if(i>=0xE9 && i<=0xF5 || i==0xE1 || i==0xE3 || i==0xE4 || i==0xE6){
  64. continue;
  65. }else if(byteKeyState[i]){
  66. flag = 1;
  67. retkey = i;
  68. break;
  69. }
  70. }
  71. }else{
  72. //引数で確認すべきキーコードが指定されてる時
  73. if(byteKeyState[keyid]) flag = 1;
  74. }
  75. if((flag==0) && ((timeout == 0) || ((timeout>0)&&((int)(timeGetTime() - starttime) >=timeout)))){
  76. retkey = -2;
  77. break;
  78. }
  79. }while(flag == 0);
  80. timeEndPeriod(1);
  81. return retkey;
  82. }
  83.  
  84.  
  85. int WaitPressKeyEx(int NumberOfKeys,int timeout,bool isAND,...){
  86. int byteKeyState, *keycodes , retkey=0 ,cnt ;
  87. int andendflag , orendflag=0;
  88. va_list dynamic_val;
  89. int starttime;
  90. if(NumberOfKeys == 0 || NumberOfKeys>256)return -1;
  91.  
  92. //動的メモリ確保
  93. keycodes = new int[NumberOfKeys];
  94. //キーリスト取得開始
  95. va_start(dynamic_val , isAND);
  96.  
  97. //キーリスト取得ループ
  98. for(cnt = 0 ; cnt < NumberOfKeys ; cnt++) *(keycodes + cnt) = va_arg(dynamic_val,int);
  99. //キーリスト取得完了
  100. va_end(dynamic_val);
  101.  
  102. timeBeginPeriod(1);
  103. starttime = timeGetTime();
  104. do{
  105. //キーボードの状態確認ループ
  106. for(cnt = 0 , andendflag = 1,orendflag = 0; cnt < NumberOfKeys ; cnt++){
  107. byteKeyState = (GetAsyncKeyState(*(keycodes + cnt)) & 0x8000) >> 15;
  108. if(isAND){
  109. andendflag *= byteKeyState ;
  110. if(andendflag == 0)break;
  111. }else if(byteKeyState){
  112. orendflag = 1;
  113. retkey = *(keycodes + cnt);
  114. break;
  115. }
  116. }
  117. if((!orendflag && !andendflag) && ((timeout == 0) || ((timeout>0)&&((int)(timeGetTime() - starttime) >=timeout)))){
  118. retkey = -2;
  119. break;
  120. }
  121. }while((isAND && !andendflag) || (!isAND && !orendflag));
  122. timeEndPeriod(1);
  123. //動的メモリ解放
  124. delete []keycodes;
  125. return (isAND && retkey!=-2) ? 0 : retkey;
  126. }
Add Comment
Please, Sign In to add comment