HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Вопросы по WinAPI
GetAsyncKeyState и все-все-все
Страницы (5): [1] 2 3 4 5 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Вопрос по GetAsyncKeyState

Имеется программка которая записывает мои нажатые клавиши в файлик в духе:
[SPACE] 3500ms
[SPACE] 3500ms
[SPACE] 3500ms
[SPACE] 3500ms
[SPACE] 3500ms

И всё бы хорошо, но при нажатии клавиш Shift, Ctrl или Alt он генерирует лишнее пустое событие. Как от него избавиться?

3219ms
[ALT] 3219ms
3219ms
[ALT] 3219ms
3219ms
[ALT] 3219ms
3219ms
[ALT] 3219ms

Собственно сам код:

C++ Source Code:
1
#include <windows.h>
2
#include <stdio.h>
3
 
4
#define FILE_NAME "keylog.txt"
5
 
6
int main() {
7
  printf("Listen your keys, close to stop\n");
8
  remove(FILE_NAME);
9
  FILE *file = fopen(FILE_NAME, "a");
10
  if (file == NULL) {
11
    printf("Error opening file!\n");
12
    return 1;
13
  }
14
 
15
  DWORD keyCode;
16
  DWORD startTime = GetTickCount();
17
 
18
  while (1) {
19
    for (keyCode = 8; keyCode <= 190; keyCode++) {
20
 
21
 
22
      if (GetAsyncKeyState(keyCode) & 0x8000) {
23
        DWORD currentTime = GetTickCount() - startTime;
24
        if (keyCode >= 65 && keyCode <= 90) {
25
          if (!(GetAsyncKeyState(VK_SHIFT) & 0x8000)) {
26
            fputc(keyCode + 32, file);
27
          } else {
28
            fputc(keyCode, file);
29
          }
30
        } else if (keyCode >= 48 && keyCode <= 57) {
31
          fputc(keyCode, file);
32
        } else if (keyCode == VK_SPACE) {
33
          fputs("[SPACE]", file);
34
        } else if (keyCode == VK_RETURN) {
35
          fputs("[ENTER]", file);
36
        } else if (keyCode == VK_TAB) {
37
          fputs("[TAB]", file);
38
        } else if (keyCode == VK_BACK) {
39
          fputs("[BACKSPACE]", file);
40
        } else if (keyCode == VK_ESCAPE) {
41
          fputs("[ESCAPE]", file);
42
        } else if (keyCode == VK_CAPITAL) {
43
          fputs("[CAPSLOCK]", file);
44
        } else if (keyCode == VK_SHIFT) {
45
          fputs("[SHIFT]", file);
46
        } else if (keyCode == VK_CONTROL) {
47
          fputs("[CTRL]", file);
48
        } else if (keyCode == VK_MENU) {
49
          fputs("[ALT]", file);
50
        } else if (keyCode == VK_UP) {
51
          fputs("[UP]", file);
52
        } else if (keyCode == VK_DOWN) {
53
          fputs("[DOWN]", file);
54
        } else if (keyCode == VK_LEFT) {
55
          fputs("[LEFT]", file);
56
        } else if (keyCode == VK_RIGHT) {
57
          fputs("[RIGHT]", file);
58
        }
59
 
60
        fprintf(file, " %ldms\n", currentTime); // time in miliseconds
61
        fflush(file);
62
 
63
      }
64
    }
65
  }
66
 
67
  fclose(file);
68
  return 0;
69
}

Отредактировано FiEctro 28-01-2023 в 23:35

Сообщить модератору | | IP: Записан
Сообщение: 212544

Старое сообщение 28-01-2023 23:20
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


FiEctro
У тебя же два шифта - левый и правый. Так же, как альты и контролы.
Полагаю, что один сканкод это общий VK_SHIFT, а второй VK_L(R)SHIFT, ну и аналогично.

Цитата:
FiEctro писал:
Как от него избавиться?

ДА НЕ КАК!!
Просто игнорируй тот из сканкодов, который тебе неинтересен.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 212545

Старое сообщение 29-01-2023 00:53
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



XaeroX
Спасибо. Действительно срёт дополнительно ещё левым альтом.

Сообщить модератору | | IP: Записан
Сообщение: 212546

Старое сообщение 29-01-2023 19:41
- За что?
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Ещё такой вопрос, как можно средствами винды выводить звук асинхронно?
Пробовал с помощью Winmm использовать PlaySound, довольно просто его вызвать, и указывать флаги на синхронную и асинхронную загрузку, однако смешиваться он не умеет.

Попробовал с помощью mciSendString, вроде то что надо, но для каждого потока он в трее вызывает отдельный ffdshow audio decoder что немного выглядит нелепо, но зато звуки смешиваются

Отредактировано FiEctro 21-02-2023 в 10:19

Сообщить модератору | | IP: Записан
Сообщение: 212828

Старое сообщение 21-02-2023 10:18
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


FiEctro
Напиши свой микшер для WaveMapper.
Ну или возьми из кваки.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 212830

Старое сообщение 21-02-2023 14:05
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Цитата:
XaeroX писал:
Напиши свой микшер для WaveMapper.


Как это должно работать?

Цитата:
XaeroX писал:
Ну или возьми из кваки.


Мде, лучше уж тогда библиотеки внешние юзать.

Сообщить модератору | | IP: Записан
Сообщение: 212831

Старое сообщение 21-02-2023 15:50
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FiEctro писал:
Мде, лучше уж тогда библиотеки внешние юзать.

Чем лучше?
Тебе проще добавить в проект зависимость, за которой придётся следить, а то и править чужие баги, или потратить один день, разобраться и написать несложный модуль, который потом можно будет при желании как угодно расширять?

Добавлено 21-02-2023 в 10:58:

Цитата:
FiEctro писал:
Как это должно работать?

Да в общем-то так же, как работает любой микшер - хоть виндовский WaveMapper или DirectSound, хоть линуксовая ALSA, хоть маковский CoreAudio.
1. Открываешь устройство
2. Устанавливаешь нужные параметры вывода
3. Заполняешь буферы семплами из твоих wav-файлов (в отдельном потоке или в специальной апдейт-функции)
4. Засылаешь буферы в устройство

А, ну придётся ещё код загрузки wav-файлов написать. И ресемплирования при необходимости. В кваке это всё тоже есть.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 212832

Старое сообщение 21-02-2023 15:58
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Цитата:
XaeroX писал:
Тебе проще добавить в проект зависимость, за которой придётся следить, а то и править чужие баги, или потратить один день, разобраться и написать несложный модуль, который потом можно будет при желании как угодно расширять?


Я не настолько хороший программист как ты думаешь

Сообщить модератору | | IP: Записан
Сообщение: 212833

Старое сообщение 21-02-2023 15:59
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


FiEctro
Не нужно быть хорошим программистом, чтобы выдрать звуковой движок из кваки и вставить его обратно, это даже Бумер умел.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 212834

Старое сообщение 21-02-2023 16:43
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Можно кстати поподробнее про пункт 3 и ресемплирование? Я не очень понял этот момент.

Сообщить модератору | | IP: Записан
Сообщение: 212835

Старое сообщение 21-02-2023 16:47
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



FiEctro в моём понимании что карту в блокноте делать, что средствами винды выводить асинхронно звук - это одно и тоже. Может тебе на завод надо?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 212836

Старое сообщение 21-02-2023 17:38
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FiEctro писал:
Можно кстати поподробнее про пункт 3 и ресемплирование? Я не очень понял этот момент.

Ты создаёшь буфер с определённым сэмпл-рейтом, допустим 22kHz.
А вав-файлы бывают 11, 22, 44 и 48 kHz. Тебе надо при загрузке ресемплировать звук в битрейт твоего буфера. Посмотри, как это делается в кваке, там всё предельно понятно.
В халфе, впрочем, иначе - там вав-файлы не ресемплятся, а заводится несколько буферов для каждого семпл-рейта, фреймы аудио микшируются в соответствующем буфере, а потом буферы уже микшируются в общий буфер для девайса. Ну как-то так, этот момент Дядя Миша лучше прояснит, т.к. делал подобное в ксаше.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 212837

Старое сообщение 21-02-2023 17:47
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Цитата:
Дядя Миша писал:
FiEctro в моём понимании что карту в блокноте делать, что средствами винды выводить асинхронно звук - это одно и тоже. Может тебе на завод надо?



Ну вот я и думаю лучше либы наверное заюзать, но все же интересно как оно работает. А по поводу пойти на завод это ты разработчикам Мелкософта предложи, не моя это прихоть. Вообще виндовые либы какие то чудоковатые.

Цитата:
XaeroX писал:
Ты создаёшь буфер с определённым сэмпл-рейтом, допустим 22kHz.
А вав-файлы бывают 11, 22, 44 и 48 kHz. Тебе надо при загрузке ресемплировать звук в битрейт твоего буфера. Посмотри, как это делается в кваке, там всё предельно понятно.
В халфе, впрочем, иначе - там вав-файлы не ресемплятся, а заводится несколько буферов для каждого семпл-рейта, фреймы аудио микшируются в соответствующем буфере, а потом буферы уже микшируются в общий буфер для девайса. Ну как-то так, этот момент Дядя Миша лучше прояснит, т.к. делал подобное в ксаше.


Понятно, спасибо, поковыряю, хотя скорее врядли что то пойму, в коде кваки логика для меня не очень понятная.

Отредактировано FiEctro 21-02-2023 в 18:25

Сообщить модератору | | IP: Записан
Сообщение: 212839

Старое сообщение 21-02-2023 18:17
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FiEctro писал:
А по поводу пойти на завод это ты разработчикам Мелкософта предложи, не моя это прихоть.

Ну тогда надо вообще всем разработчикам ОС предъявить, чего мелочиться. Это в какой же ОС ты из коробки видел асинхронное проигрывание и микширование звуков? Самый простой вариант - DirectSound, но и он потребует кое-каких усилий.
Цитата:
FiEctro писал:
лучше либы наверное заюзать

Сейчас те, кто хочет программировать, не вникая в низкий уровень, юзают SDL. Смотрел в этом направлении?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 212842

Старое сообщение 21-02-2023 18:25
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12882
Возраст: 32

Рейтинг



Цитата:
XaeroX писал:
Сейчас те, кто хочет программировать, не вникая в низкий уровень, юзают SDL. Смотрел в этом направлении?


Да очень поверхностно. Кстати тоже хороший вариант.

Добавлено 21-02-2023 в 21:41:

Цитата:
XaeroX писал:
Ну тогда надо вообще всем разработчикам ОС предъявить, чего мелочиться. Это в какой же ОС ты из коробки видел асинхронное проигрывание и микширование звуков?


Ну почему же оно как бы и реализовано, но как я писал выше очень странно и нелогично. Майкрософт и народ из гугла просто предлагает вызывать их напрямую что я и делал, а вы говорите что нужно писать в общий буфер. Вот и не понятно зачем они тогда людей путают?

Сообщить модератору | | IP: Записан
Сообщение: 212846

Старое сообщение 21-02-2023 18:41
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 02:15. Новая тема    Ответить
Страницы (5): [1] 2 3 4 5 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Вопросы по WinAPI
GetAsyncKeyState и все-все-все
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024