Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.019 c
11-1161608565
Barloggg
2006-10-23 17:02
2008.02.03
Как в Word создать таблицу?


3-1190804341
Vazhik
2007-09-26 14:59
2008.02.03
Псевдоним БД


2-1199439571
Саша
2008-01-04 12:39
2008.02.03
Как лучше организовать базу данных?


3-1190726990
Циркуль
2007-09-25 17:29
2008.02.03
Не открываются .dbf, пока не закрыта создавшая один из них


15-1199134826
Ega23
2008-01-01 00:00
2008.02.03
С Новым Годом!!!!