2015-05-07 4 views
0

Я пишу, чтобы получить уверенность в процедурах программирования, приложение win32, которое отвечает на ввод с клавиатуры. Для этого я использую функцию GetAsyncKeyState().Могу ли я использовать GetAsyncKeyState() вне функции main()?

Сначала я написал весь свой код в функции main(), и все выглядело хорошо, это сработало. Поэтому я решил усложнить ситуацию, но это требует от меня использовать функцию GetAsyncKeyState() в другой функции, вызываемой main(). Я думал, что мне просто нужно было объявить несколько переменных вне main() и переместить код из main новой функции, как это:

int btnup_down = 0; 
int close = 1; 
int main(void){ 
    while (1){ 
     Sleep(50); 
     listentokb(); 
     if (close == 0){ 
      break; 
     } 
    }return 0; 
} 
int listentokb(void){ 
    if ((GetAsyncKeyState(0x4C) & 0x8000) && (ko == 0)){ 
     ko = 1; 
     printf("Ok you pressed k"); 
     return 0; 
    } else if (((GetAsyncKeyState(0x4C) == 0) && (ko == 1)) { 
     ko = 0; 
     printf("Now you released it"); 
     close = 0; 
     return 0; 
    }return 0; 
} 

Когда я запускаю этот код, цикл продолжает идти, и если это не имеет значения Я нажимаю клавишу или нет, она продолжает цикл, не печатая ничего. Любая помощь будет очень восприимчивой.

+0

Вы, конечно, не нужны глобальные переменные для этого. Кроме того, 0x4C является клавишей L. – chris

ответ

0

Ваша проблема не имеет ничего общего с main() или нет. Вы можете вызвать функцию winapi, такую ​​как GetAsyncKeyState(), где бы вы ни находились в вашем коде, если вы обеспечиваете хорошие настройки.

Согласно этому списку virtual key codes код 0x4c соответствует ключевому L, а не к ключевым K. Таким образом, после коррекции опечатки скобки в коде, я мог бы запустить его успешно interupting цикла с L

Некоторых замечаний по поводу вашей функции:

Вашей функция listentokb() всегда возвращает 0. С другой стороны, вы используете глобальную переменную close, чтобы сообщить вызывающей функции результат сканирования вашей клавиатуры. Это очень плохая практика: по возможности избегайте глобальных переменных.

Здесь немного обновленную версию кода, который запрещает глобальные переменные и использовать возвращаемое значение для связи результаты:

const int KEY_K = 0x4B; // avoid using values directly in the code 

int listentokb (void){ // returns 'K' if K is released and 0 otherwise 
    static int ko;  // this is like a global variable: it will keep the value from one call to the other 
         // but it has teh advantage of being seen only by your function 
    if((GetAsyncKeyState(KEY_K) & 0x8000) && (ko == 0)){ 
     ko = 1; 
     printf("Ok you pressed k"); 
     return 0; 
    } 
    else if((GetAsyncKeyState(KEY_K) == 0) && (ko == 1)) { 
     ko = 0; 
     printf("Now you released it"); 
     return 'K'; 
    } 
    return 0; 
} 
int main(void){ 
    bool go_on = true; // The state of the loop shall be local variable not global 
    while(go_on){ 
     Sleep(50); 
     go_on= ! listentokb(); // if returns 0 we go on 
    } 
    return 0; 
} 
+0

Большое спасибо! – Febz

Смежные вопросы