Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Вниз

Посыл клав. события - помогите переделать процедуру   Найти похожие ветки 

 
=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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.037 c
2-1199770321
XerSon
2008-01-08 08:32
2008.02.03
Как в реестр записать и считать двоичные данные, к примеру (50)


2-1199875558
DevilDevil
2008-01-09 13:45
2008.02.03
Правильные Panel-и на ControlBar-е


2-1199868237
DevilDevil
2008-01-09 11:43
2008.02.03
Почему может возникать неправильная максимизация ?


2-1199563356
Vitaliano
2008-01-05 23:02
2008.02.03
Подскажите новичку


15-1199064852
SerJaNT
2007-12-31 04:34
2008.02.03
mod_rewrite & PHP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский