morwin 0 Жалоба Опубликовано January 9, 2012 Доброго время суток. Помогите разобраться. Как определить нажата ли кнопка q при включенном Num Lock. if (cvWaitKey(0) == 'q') cout << "you press: q"; при включенном Num Lock не работает Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 9, 2012 у меня работает. Может окно не в фокусе? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
morwin 0 Жалоба Опубликовано January 9, 2012 Тестировал на ноутбуке с Ubuntu и на нетбуке c Arch Linux. Не работает (( Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 9, 2012 http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlkeycodes.html когда с NumLock-ом, то 'Q' - надо проверять. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
morwin 0 Жалоба Опубликовано January 9, 2012 http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlkeycodes.html когда с NumLock-ом, то 'Q' - надо проверять. Не подходит. При выключеном Num Lock при нажатии на "q" key=113 При включенном key=1048689 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 9, 2012 ну сделайте так с=waitKey()&0xFF и будет Вам счастье 1048689 = 100000000000001110001 113 = 1110001 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
morwin 0 Жалоба Опубликовано January 9, 2012 Точно! Дальше справлюсь. Спасибо большое. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
morwin 0 Жалоба Опубликовано January 9, 2012 Ну очень интересно что ж это за баг такой. Вот в коде https://code.ros.org/svn/opencv/trunk/opencv/modules/highgui/src/window_gtk.cpp есть интересная штука. static gboolean icvOnKeyPress( GtkWidget * /*widget*/, GdkEventKey* event, gpointer /*user_data*/ ) { int code = 0; switch( event->keyval ) { case GDK_Escape: code = 27; break; case GDK_Return: case GDK_Linefeed: code = '\n'; break; case GDK_Tab: code = '\t'; break; default: code = event->keyval; } code |= event->state << 16; #ifdef HAVE_GTHREAD if(thread_started) g_mutex_lock(last_key_mutex); #endif last_key = code; "code |= event->state << 16;" По ходу это и есть тот сдвиг за 16 бит Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 10, 2012 Ну так не баг это. Просто берут код клавиши, и накладывают на него по ИЛИ (в старшие 16 бит) код состояния системы ввода (разные шифты, сонтролы и альты, плюс к этому часто еще состояние мышиных кнопок туда добавляют). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах