
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
01.08.2005, 10:54:59
|
|||
|---|---|---|---|
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
GetKeyboardState и подобные функции очень плохо считывают состояние виртуальных клавиш (по таймеру), если вызывающее их приложение неактивно или вообще висит где-то сзади. Таймер работает нормально. А вот если провести над формой этого приложения мышкой, даже не передавая фокус приложению, не активизируя его, то все сразу отрабатывается. Кто виноват и Что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 12:12:42
|
|||
|---|---|---|---|
|
|||
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
Виноват, конечно же, БГ и концепция многозадачности Виндоуз. Апликуха, которая находится в фокусе получает больше процессорного времени на свое выполнение, чем фоновая. Сие позволяет Пользователю, работающему в данный момент с соответственно активной программой чувствовать себя так, как будто комп занят выполнением только этой одной задачи. Согласитесь, что при наличии пары-тройки десятков одновременно запущенных приклад это является достойным решением. А по поводу курсора мыши, дык на форме могут быть реализованы всякие там "маустрэкинг" - ну, там, например, изменение картинки при перемещении над ней курсора мыши, или еще что, вот система и "выдает" даже неактивной апликухе возможность побыстрому все это дело отработать, тем более что при обработке мышиных сообщений, как и при ловле блох, нужна скорость. Правда, я не понял двух вещей: 1) если у Вас "Таймер работает нормально", а по таймеру происходит выполнение "GetKeyboardState и подобные функции", то в чем заключается "очень плохо считывают состояние виртуальных клавиш"? 2) а оно Вам надо в VB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 13:48:55
|
|||
|---|---|---|---|
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
1) по таймеру обращение к GetKeyboardState происходит регулярно. Т.е. апликуха не тормозится, даже будучи фоновой. Дык вот только возвращается ей, извините, кака. 2) Надо. Отслеживаю NUM, CAPS и раскладку клавиатуры. Да и какая разница - VB, не VB. В других тоже самое! Вооот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 14:38:29
|
|||
|---|---|---|---|
|
|||
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
если я правильно понимаю устройство этой балалайки - GetKeyboardState возвращает данные из очереди входных сообщений, ассоциированной с текущим потоком исполнения (вашим экзешником в котором таймер и прочая). Когда ваше приложение уходит в фоновое исполнение система перестает транслировать ему сообщения клавиатуры из общесистемной очереди. Которую Вам и хотелось бы прослушивать. Думаю, ответ надо искать по словам "хук на общесистемную очередь". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 14:45:26
|
|||
|---|---|---|---|
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
Да я тоже думал что-то похожее. Поставил я вообще хук, и считывал эту GetKey при любом событии (поступающем сообщении), т.е тупо, не глядя на lPar и WM - хвать GetKey! А там - опять кака. :(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 14:53:26
|
|||
|---|---|---|---|
|
|||
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
авторТ.е. апликуха не тормозится, даже будучи фоновой.А кто говорил, что она тормозится полностью? Уж точно не я... А если вы под "тормозится" имеете в виду "работает медленней", то поверьте на слово - Вы не правы, и "она", т.е. фоновая задача, работает медленней активной. Ничего и никому доказывать не буду... авторДык вот только возвращается ей, извините, кака.Это такое эдакое "нечто" цвета от нежно желтого до темно коричнегого? Хм... А должно было возвращаться либо массив состояний виртуальных клавиш (кстати, с NUM, CAPS и SCROLL еще надо уметь обращаться правильно), либо код ошибки, доступный через GetLastError... Странно все это, ой странно... автор2) Надо. ОК... авторОтслеживаю NUM, CAPS...ИМХО, легче и эффективней было бы через GetKeyState... Впрочем, не настаиваю... автор...и раскладку клавиатуры.ИМХО, легче и эффективней было бы через GetKeyboardLayout... Впрочем, не настаиваю... авторДа и какая разница - VB, не VB. В других тоже самое! Не надо так кричать, я ж не глухой... А на счет вопроса №2 я так... Убедиться, что Вы, не зная где лежат ключи от квартиры, не пытаетесь наклеить обои через замочную скважину... авторВооот.Аналогично... З.Ы. А поведение функций аппаратного ввода может еще зависить от ОС: в Win3.N - одно, в Win95/98 - другое, в WinNT/2K - совсем третье... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 15:28:55
|
|||
|---|---|---|---|
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
Ну, Синий 1 Ну, насчет тормозится мы друг друга поняли. 2 Да обращаться умею. Ошибка не возвращается. Массив состояний возвращается необновленный. 3, 4 я ж написал "...подобные функции" 5 Да я и не кричу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 15:46:44
|
|||
|---|---|---|---|
|
|||
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
Letter_D.... Массив состояний возвращается необновленный.... хелп на GetKeyboardState в этом месте вполне однозначен и определен: msdn->sdk plat->GetKeyboardStateThe status changes as a thread removes keyboard messages from its message queue. The status does not change as keyboard messages are posted to the thread's message queue, nor does it change as keyboard messages are posted to or retrieved from message queues of other threads. ну не может оно измениться, пока вы в бэкграунде... (по крайней мере, я так думаю.) а про каку - это предъявлять надо, как предмет для анализа. одного этого слова для диагноза врядли достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 15:55:08
|
|||
|---|---|---|---|
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
красно-белый, да говорить-то он говорит... Только вот я заметил (писал уже выше), что махнув поверх него мышкой, не выводя из бэкграунда... и при каких-то других событиях, обновление всеж происходит. Как бы эта... того бы... обновить насильно, ага... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 15:59:03
|
|||
|---|---|---|---|
|
|||
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
Дык, если мне ничто не изменяет, то по этим апишным функциям возвращается снимок (состояние) клавиш на момент последнего чтения сообщений клавиатуры и мыши (аппаратного ввода) потоком. Т.е. можно попробовать обхитрить систему, послав окну ВАШЕЙ программы (точнее окну вашего потока) сообщение с якобы нажатием какой либо клавиши или движением мыши. Ваш поток, глЮпый, подумает, что это аппаратный ввод и обновит свой локальный массив состояний... Хотя, что-то есть еще, что я вроде помню, но забыл... Если вспомню, то загляну. ОК?Да я и не кричу... авторДа я и не кричу...Да я так, убедиться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.08.2005, 16:29:05
|
|||
|---|---|---|---|
Функции GetKeyboardState нужен фокус формы? |
|||
|
#18+
Синий Ай, маладца! Точняк, вставил в таймер перед вызовом GetKey... 2 оператора: Call keybd_event(0, 0, 0, 0) Call keybd_event(0, 0, &H2, 0) Нажал, отпустил виртуальную клавишу с индексом 0 (интересно, что это за клавиша? Ну можно и другую неиспользуемую...), и все обновляется! Йец. А еще интересно, как себя чувствует поток, которому это нажатие досталось? Я ж посылаю не себе, а кому там достанется по таймеру. Гы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=60&tablet=1&tid=2167412]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 263ms |

| 0 / 0 |
