![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посыл клав. события - помогите переделать процедуру [D6, WinXP]
=BuckLr= © (2007-06-15 21:19:00)Привет. Проблема вот в чём. Мне нужно послать сочетание клавиш в неактивное окно, при этом 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;
и всё работает отлично, однако посылает только на одну клавишу. А мне надо сразу на четыре. К сожалению, специфика задачи такова, что абсолютно подходит только этот способ. А так как ассемблера я не знаю :( то прошу помочь с процедурой. Если кто-нибудь переделает её так, чтобы она принимала сразу четыре кода клавиши, последовательно "нажимала" их, а затем "отпускала", то буду чрезмерно благодарен
Заранее примите благодарность
Leonid Troyanovsky (2007-06-29 13:11:00) [1]
> =BuckLr= (29.06.07 05:01) [25]
> Что-то я не понимаю :(
А чего тут понимать?
Нет у EDIT багов, описанных в [13].
> А это запрещено? Плагин-то нужно на апи состряпать...
Стряпай, кто ж против.
Асм, потоки, win32, VCL, KOL, C, dll & etc -
весьма аппетитная солянка.
--
Regards, LVT.
=BuckLr= (2007-06-29 05:01:00) [2]Что-то я не понимаю :(
> Во-первых, сокрытие важных улик.
Каких???
> Во-вторых, необоснованное смешение VCL & API
А это запрещено? Плагин-то нужно на апи состряпать...
> В-третьих, необоснованное использование длл.
Опять же, это только пример. длл есть небольшой плагин для некоторой программы, которая, кстати, на сях написана и к всл не имеет отношения.
Не понимаю, честное слово
Leonid Troyanovsky (2007-06-28 22:18:00) [3]
> =BuckLr= (28.06.07 10:41) [23]
> > Нехорошо, Эдик, нехорошо.
> Я не Эдик вообще-то :)
Какая разница. Все равно ж - нехорошо.
> Почему? Неужели всё так плохо? :(
Во-первых, сокрытие важных улик.
Во-вторых, необоснованное смешение VCL & API.
В-третьих, необоснованное использование длл.
--
Regards, LVT.
=BuckLr= (2007-06-28 10:41:00) [4]
> Нехорошо, Эдик, нехорошо.
Я не Эдик вообще-то :) Или это не ко мне?
> Если б знал, что там длл, то и качать бы не стал.
Почему? Неужели всё так плохо? :(
Leonid Troyanovsky (2007-06-27 15:10:00) [5]
> =BuckLr= (26.06.07 20:54) [21]
> Ну вот исходничек проблемы. Всё по минимуму, но даже так
> я не угадаю, в чём дело :(
Если б знал, что там длл, то и качать бы не стал.
Нехорошо, Эдик, нехорошо.
--
Regards, LVT.
=BuckLr= (2007-06-26 20:54:00) [6]Ну вот исходничек проблемы. Всё по минимуму, но даже так я не угадаю, в чём дело :(
http://ifolder.ru/2496199
Leonid Troyanovsky (2007-06-23 18:48:00) [7]
> =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-22 20:40:00) [8]а, ну это ещё сделать надо заново... Ну а пока я буду делать, не подскажете, хтоя бы примерно, где грабли? Ведь, я так понял, в уже сталкивались с этим?
Leonid Troyanovsky (2007-06-22 18:39:00) [9]
> =BuckLr= (22.06.07 16:30) [17]
> Исходник на КОЛ пойдёт?
Не, нам ту самую, на чистом АПИ,
дабы по тематике.
--
Regards, LVT.
=BuckLr= (2007-06-22 16:30:00) [10]
> Показывай свой баг.
Исходник на КОЛ пойдёт?
Leonid Troyanovsky (2007-06-22 13:11:00) [11]
> =BuckLr= (22.06.07 10:01) [15]
> значит, есть не менее известное решение бага?
Показывай свой баг.
--
Regards, LVT.
=BuckLr= (2007-06-22 10:01:00) [12]
> нередко встречающийся
> у начинающих апиписателей
значит, есть не менее известное решение бага? Поделитесь, пожалуйста, очень прошу
Leonid Troyanovsky (2007-06-21 22:14:00) [13]
> =BuckLr= (21.06.07 22:08) [13]
> запускать в осн потоке, то перестают обрабатываться нажатия
> клавиш влево-вправо на поле ввода (известная бага).
Да, это известный баг, нередко встречающийся
у начинающих апиписателей.
--
Regards, LVT.
=BuckLr= (2007-06-21 22:08:00) [14]Дело в том, что это не ВСЛ. Это на КОЛ всё пишется, и если запускать в осн потоке, то перестают обрабатываться нажатия клавиш влево-вправо на поле ввода (известная бага). Такая же история происходит и программой, написанной на чистом АПИ. Поэтому и поместил в отдельный поток. Других способов не знаю...
Сергей М. (2007-06-21 13:48:00) [15]
> длл-ка создаёт форму + поле ввода, причём в отдельном потоке
Нефих делать в отдельном потоке ни форме ни полю ввода.
И то и другое, если это VCL-компоненты, должно создаваться и эксплуатироваться в осн.потоке.
=BuckLr= (2007-06-21 00:37:00) [16]Стоило без инета остаться, блин...
> ну все равно в xp, особенно sp2 такие штучки не пройдут.
> . в висте подавно.
Так вот и не работает ни хрена. Короче, дело в следующем. Есть прога, есть моя длл-ка, загруженная той прогой. Из длл нужно послать клав. комбинацию в программу (так надо.....). длл-ка создаёт форму + поле ввода, причём в отдельном потоке. И тогда-то keybd_event не срабатывает. Стоит создать форму в основном потоке, как всё ОК. В чём дело? Вот я и уцепился за ассемблерную процедуру. Ведь работает, зараза.
Углук (2007-06-17 22:43:00) [17]
> Eraser © (17.06.07 22:10) [9]
Да, Вы правы насчет проблематичности, а я был не прав...
Ну хорошо, тогда другой вариант: узнать Handle неактивной программы, узнать ее Rect, эмулировать щелчок мышки при помощи mouse_event внутри Rect и передавать нажатия
Eraser (2007-06-17 22:10:00) [18]> [8] Углук © (17.06.07 22:04)
а..
ну все равно в xp, особенно sp2 такие штучки не пройдут.. в висте подавно.
Углук (2007-06-17 22:04:00) [19]Eraser © (17.06.07 20:55) [7]
Я юзал как раз с AttachThreadInput
Eraser (2007-06-17 20:55:00) [20]> [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.
> Активных окон не может быть у программы, у которой нет
> окон вообще, иначе единственное окно останется активным.
> Так?
> А где оговорено, что у программы не должно быть окон? В
> задаче об этом ни слова.
при чем здесь есть у программы окна или нет..