Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Посыл клав. события - помогите переделать процедуру [D6, WinXP]


Страницы:   1 2

=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.

> Активных окон не может быть у  программы, у которой нет
> окон вообще, иначе единственное окно останется активным.
> Так?
> А где оговорено, что у программы не должно быть окон? В
> задаче об этом ни слова.

при чем здесь есть у программы окна или нет..


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо