Текущий архив: 2008.02.03;
Скачать: CL | DM;
ВнизПосыл клав. события - помогите переделать процедуру Найти похожие ветки
← →
=BuckLr= (2007-06-15 21:19) [0]Привет. Проблема вот в чём. Мне нужно послать сочетание клавиш в неактивное окно, при этом keybd_event иногда не срабатывает. В Делфи ворлде накопал такой код:
procedure EmulateKey(Wnd: HWND; VKey: Integer);
asm
push 0
push edx
push 0101H //WM_KEYUP
push eax
push 0
push edx
push 0100H //WM_KEYDOWN
push eax
call PostMessage
call PostMessage
end;
и всё работает отлично, однако посылает только на одну клавишу. А мне надо сразу на четыре. К сожалению, специфика задачи такова, что абсолютно подходит только этот способ. А так как ассемблера я не знаю :( то прошу помочь с процедурой. Если кто-нибудь переделает её так, чтобы она принимала сразу четыре кода клавиши, последовательно "нажимала" их, а затем "отпускала", то буду чрезмерно благодарен
Заранее примите благодарность
← →
Eraser © (2007-06-15 22:06) [1]> procedure EmulateKey(Wnd: HWND; VKey: Integer);
> asm
> push 0
> push edx
> push 0101H //WM_KEYUP
> push eax
> push 0
> push edx
> push 0100H //WM_KEYDOWN
> push eax
> call PostMessage
> call PostMessage
> end;
ужосс )
ассемблер тут ни к чему.
← →
Углук © (2007-06-17 19:47) [2]
> keybd_event иногда не срабатывает.
Сделайте окно активным и сработает на 100%.
← →
Eraser © (2007-06-17 20:07) [3]> [2] Углук © (17.06.07 19:47)
в xp сделать окно активным из неактивной программы проблемотично.
← →
Углук © (2007-06-17 20:13) [4]SetActiveWindow?
← →
Eraser © (2007-06-17 20:33) [5]> [4] Углук © (17.06.07 20:13)
тогда уж SetForegroundWindow, т.к. SetActiveWindow будет работать только для окон текущего потока.
попробуйте вызвать эту ф-цию из программы, у которой нет в данный момент активных окон )
← →
Углук © (2007-06-17 20:41) [6]
> SetActiveWindow будет работать только для окон текущего
> потока
По-моему, Вы ошибаетесь. Совсем недавно я вроде бы переключался на окно другого потока через эту функцию.
> попробуйте вызвать эту ф-цию из программы, у которой нет
> в данный момент активных окон )
Активных окон не может быть у программы, у которой нет окон вообще, иначе единственное окно останется активным. Так?
А где оговорено, что у программы не должно быть окон? В задаче об этом ни слова.
← →
Eraser © (2007-06-17 20:55) [7]> [6] Углук © (17.06.07 20:41)
> По-моему, Вы ошибаетесь.The SetActiveWindow function activates a window. The window must be attached to the calling thread"s message queue.
...
By using the AttachThreadInput function, a thread can attach its input processing to another thread. This allows a thread to call SetActiveWindow to activate a window attached to another thread"s message queue.
© MSDN.
> Активных окон не может быть у программы, у которой нет
> окон вообще, иначе единственное окно останется активным.
> Так?
> А где оговорено, что у программы не должно быть окон? В
> задаче об этом ни слова.
при чем здесь есть у программы окна или нет..
← →
Углук © (2007-06-17 22:04) [8]Eraser © (17.06.07 20:55) [7]
Я юзал как раз с AttachThreadInput
← →
Eraser © (2007-06-17 22:10) [9]> [8] Углук © (17.06.07 22:04)
а..
ну все равно в xp, особенно sp2 такие штучки не пройдут.. в висте подавно.
← →
Углук © (2007-06-17 22:43) [10]
> Eraser © (17.06.07 22:10) [9]
Да, Вы правы насчет проблематичности, а я был не прав...
Ну хорошо, тогда другой вариант: узнать Handle неактивной программы, узнать ее Rect, эмулировать щелчок мышки при помощи mouse_event внутри Rect и передавать нажатия
← →
=BuckLr= (2007-06-21 00:37) [11]Стоило без инета остаться, блин...
> ну все равно в xp, особенно sp2 такие штучки не пройдут.
> . в висте подавно.
Так вот и не работает ни хрена. Короче, дело в следующем. Есть прога, есть моя длл-ка, загруженная той прогой. Из длл нужно послать клав. комбинацию в программу (так надо.....). длл-ка создаёт форму + поле ввода, причём в отдельном потоке. И тогда-то keybd_event не срабатывает. Стоит создать форму в основном потоке, как всё ОК. В чём дело? Вот я и уцепился за ассемблерную процедуру. Ведь работает, зараза.
← →
Сергей М. © (2007-06-21 13:48) [12]
> длл-ка создаёт форму + поле ввода, причём в отдельном потоке
Нефих делать в отдельном потоке ни форме ни полю ввода.
И то и другое, если это VCL-компоненты, должно создаваться и эксплуатироваться в осн.потоке.
← →
=BuckLr= (2007-06-21 22:08) [13]Дело в том, что это не ВСЛ. Это на КОЛ всё пишется, и если запускать в осн потоке, то перестают обрабатываться нажатия клавиш влево-вправо на поле ввода (известная бага). Такая же история происходит и программой, написанной на чистом АПИ. Поэтому и поместил в отдельный поток. Других способов не знаю...
← →
Leonid Troyanovsky © (2007-06-21 22:14) [14]
> =BuckLr= (21.06.07 22:08) [13]
> запускать в осн потоке, то перестают обрабатываться нажатия
> клавиш влево-вправо на поле ввода (известная бага).
Да, это известный баг, нередко встречающийся
у начинающих апиписателей.
--
Regards, LVT.
← →
=BuckLr= (2007-06-22 10:01) [15]
> нередко встречающийся
> у начинающих апиписателей
значит, есть не менее известное решение бага? Поделитесь, пожалуйста, очень прошу
← →
Leonid Troyanovsky © (2007-06-22 13:11) [16]
> =BuckLr= (22.06.07 10:01) [15]
> значит, есть не менее известное решение бага?
Показывай свой баг.
--
Regards, LVT.
← →
=BuckLr= (2007-06-22 16:30) [17]
> Показывай свой баг.
Исходник на КОЛ пойдёт?
← →
Leonid Troyanovsky © (2007-06-22 18:39) [18]
> =BuckLr= (22.06.07 16:30) [17]
> Исходник на КОЛ пойдёт?
Не, нам ту самую, на чистом АПИ,
дабы по тематике.
--
Regards, LVT.
← →
=BuckLr= (2007-06-22 20:40) [19]а, ну это ещё сделать надо заново... Ну а пока я буду делать, не подскажете, хтоя бы примерно, где грабли? Ведь, я так понял, в уже сталкивались с этим?
← →
Leonid Troyanovsky © (2007-06-23 18:48) [20]
> =BuckLr= (22.06.07 20:40) [19]
> а, ну это ещё сделать надо заново... Ну а пока я буду делать,
> не подскажете, хтоя бы примерно, где грабли? Ведь, я так
> понял, в уже сталкивались с этим?
Нет кода - нет проблемы.
Пока мы так и не поняли, что это за гипотетический баг,
т.к. edit control default message processing:
WM_GETDLGCODE Returns the following values: DLGC_WANTCHARS, DLGC_HASSETSEL, and DLGC_WANTARROWS
включает обработку нажатия стрелок.
Т.е., возможны ошибки при обработке этого сообщения
для сабклассированного контрола, либо неверное
использование IsDialogMessage, либо и т.д.
Ну, и раз невыяснено, какие средства будут использованы
полезно прочитать, хотя бы
http://groups.google.com/group/borland.public.delphi.winapi/msg/28fbaf60c7c60d66
--
Regards, LVT.
← →
=BuckLr= (2007-06-26 20:54) [21]Ну вот исходничек проблемы. Всё по минимуму, но даже так я не угадаю, в чём дело :(
http://ifolder.ru/2496199
← →
Leonid Troyanovsky © (2007-06-27 15:10) [22]
> =BuckLr= (26.06.07 20:54) [21]
> Ну вот исходничек проблемы. Всё по минимуму, но даже так
> я не угадаю, в чём дело :(
Если б знал, что там длл, то и качать бы не стал.
Нехорошо, Эдик, нехорошо.
--
Regards, LVT.
← →
=BuckLr= (2007-06-28 10:41) [23]
> Нехорошо, Эдик, нехорошо.
Я не Эдик вообще-то :) Или это не ко мне?
> Если б знал, что там длл, то и качать бы не стал.
Почему? Неужели всё так плохо? :(
← →
Leonid Troyanovsky © (2007-06-28 22:18) [24]
> =BuckLr= (28.06.07 10:41) [23]
> > Нехорошо, Эдик, нехорошо.
> Я не Эдик вообще-то :)
Какая разница. Все равно ж - нехорошо.
> Почему? Неужели всё так плохо? :(
Во-первых, сокрытие важных улик.
Во-вторых, необоснованное смешение VCL & API.
В-третьих, необоснованное использование длл.
--
Regards, LVT.
← →
=BuckLr= (2007-06-29 05:01) [25]Что-то я не понимаю :(
> Во-первых, сокрытие важных улик.
Каких???
> Во-вторых, необоснованное смешение VCL & API
А это запрещено? Плагин-то нужно на апи состряпать...
> В-третьих, необоснованное использование длл.
Опять же, это только пример. длл есть небольшой плагин для некоторой программы, которая, кстати, на сях написана и к всл не имеет отношения.
Не понимаю, честное слово
← →
Leonid Troyanovsky © (2007-06-29 13:11) [26]
> =BuckLr= (29.06.07 05:01) [25]
> Что-то я не понимаю :(
А чего тут понимать?
Нет у EDIT багов, описанных в [13].
> А это запрещено? Плагин-то нужно на апи состряпать...
Стряпай, кто ж против.
Асм, потоки, win32, VCL, KOL, C, dll & etc -
весьма аппетитная солянка.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2008.02.03;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.045 c