Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Имитация нажатий на кнопоки


Автор: Славик 22.2.2005, 20:33

Привет.
Помогите пожалуйста разобраться с вопросом по Паскалю.
Я уже много чего переискал, но нигде ненахожу ответа.

Речь об имитации нажатия на кнопки клавиатуры.
Как симитировать нажатие на несколько кнопок клавиатуры ОДНОВРЕМЕННО?
Так как я новичок в программировании, мне нужен пример алгоритма, допустим
для одновременного нажатия на "abcd".
Без примера, я не обойдусь : ) Поскольку мало что понимаю...

Все это нужно для управления роликом флэш. Мне удобней будет его тестить
именно так.
Периодически, паскаль будет "нажимать" на разные сочитания кнопок, чтобы
запустить разные эпизоды ролика.

Работаю я на Free Pascal.

Еще вопрос
Нужно скрыть из вида на рабочем столе, работающий файл exe паскаля. Чтобы
был виден только флэш ролик.
Если это возможно, мне нужен пример алгоритма.


Спасибо за все заранее...

Автор: SoWa 23.2.2005, 05:27
Тебе лучше в Дельфи идти!
Из Паскаля, я не знаю как реализовать скрытие и работу с WinAPI(она-то тебе и нужна) smile

Автор: Romtek 23.2.2005, 10:02
Цитата(SoWa @ 23.2.2005, 05:27)
Тебе лучше в Дельфи идти!
Что за советы?
Можно тоже самое и в FPC сделать.
Кажется, придётся обрабатывать сообщения WM_ХХХ

Автор: Славик 23.2.2005, 14:27

Мне написали нижеописанное на другом форуме. Но мог бы кто нибудь написать мне пример алгоритма для одновременного нажатия(имитации) на "abcd"? А то я просто не знаю как пользоваться нижеописанной подсказкой. Обьяснить мне там(на форуме http://forum.pascal.net.ru) не хотят.

Тут ДВА возможных варианта передать или симитировать нажатие кнопок.

Цитата
1.

LRESULT SendMessage(

HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

2.
The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.

WM_KEYDOWN
nVirtKey = (int) wParam; // virtual-key code
lKeyData = lParam; // key data

Parameters

nVirtKey

Value of wParam. Specifies the virtual-key code of the nonsystem key.

lKeyData

Value of lParam. Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table:

Value Description
0-15 Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user holding down the key.
16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM).
24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
25-28 Reserved; do not use.
29 Specifies the context code. The value is always 0 for a WM_KEYDOWN message.
30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is 0 if the key is up.
31 Specifies the transition state. The value is always 0 for a WM_KEYDOWN message.

Автор: Snowy 24.2.2005, 09:18
Чтобы использовать эту подсказку, нужно сначала разобраться, куда ты хочешь нажимать клавиши. В смысле, кто будет получать это нажатие. Ведь ты хочешь нажать эти клавиши в какой-то чужой программе. Без знания WinAPI это будет слишком сложно. Нужно будет искать окно, посылать сообщения о нажатии каждой клавиши, потом сообщения об отпускании каждой клавиши.
Тут чистый WinAPI. Для начала тебе нужно как минимум справка по нему и знание английского.
Брось эту затею. Сам не справишься. А делать за тебя вряд ли кто-то будет.
Начни для начала с более простых вещей.

Автор: chaos 24.2.2005, 10:09
на вот посмотри:
http://www.sedinko.ru/delphi/doc7.php

Автор: Guest 24.2.2005, 15:34
Snowy

Я всего навсего хочу симитировать нажатие кнопок на клавиатуре. Никуда ничего не передавая. Просто как будто бы я сам их нажимаю.

Все это нужно для управления роликом флэш.
Периодически, паскаль будет "нажимать" на разные сочитания кнопок, чтобы
запустить разные эпизоды ролика. В ролике флэш, будет просто указано - если такие то кнопки одновременно нажаты, то... он будет кое что делать.


chaos Спасибо. Попробую разобраться более детально. Но там вроде говорится о посылании каких то значений другой программе. А мне просто надо симитировать нажатие ничего никому не высылая.
Но посмотрю и это...





Автор: Славик 24.2.2005, 15:42

Мой вопрос, может корректней бы звучал так:
Как эмулировать нажатия клавиш клавиатуры(!) из паскаля?

Ничего никому при этом не передавая.

Пользуюсь Free Pascal.


Автор: Snowy 24.2.2005, 15:59
Это тебе не DOS. В виндах у нажатия клавиш должен быть получатель. Обычно это текущее активное окно. Вот нужному окну ты и должен послать сообщение о том, что клавиша нажата. Само окно не догадается. Иначе клавиши надимались бы во всех окнах, независимо от того, с каким мы работаем.
Добавлено @ 16:01
Просто нажитие клавиш - SetKeyboardState. Но клавиши тогда нажмутся в твоем окне. Твой ролик об этом даже не узнает.
Добавлено @ 16:02
И зарегестрируйся

Автор: Fedor 24.2.2005, 16:27
Ребят, а может просто можно считывать из буфера клавиатуры? Сорри, не знаю, что происходит когда нажимаются одновременно четыре клавиши? Если они просто заносятся в буффер одновременно - на них можно readkey наслать.

Автор: Snowy 24.2.2005, 17:25
Это же винда!!! В DOS'e пожалуйста. Только из буфера они и прочитаются поочереди.
Для винды засунуть 4 символа в буфер, то же самое, что послеть 4 нажатия и 4 отпускания клавиш. нажал-отжал, нажал-отжал, нажал-отжал, нажал-отжал.
Здесь же нужно послать сначала 4 нажатия, а потом четыре отжатия.
В любом случае нужно посылать.

Автор: Slavik 24.2.2005, 18:16

Цитата
И зарегестрируйся

Сделано ; )

В флэш я пишу скрипт в программе -
Код

Key.addListener(this);
this.onKeyDown = function() {
if (Key.isDown(65)&&Key.isDown(66)&&Key.isDown(67)) {
       gotoAndPlay(2);
   }

};

Нужно чтобы мне на флэш ничего не отсылалось, а всего лишь симитировалось нажатие на кнопки.
Ранее, я с одним человеком разрабатывали игру. Он на Дельфи имитировал нажатие на кнопки, а я вышеописанным образом ловил эти нажатия.
Работало : )
Но мне нужно такое реализовать самому в паскале. Пусть через DOS или как то еще. Мне пока все равно, главное чтобы это был язык Паскаля : ) И чтобы работало. : )

А вообще, спасибо вам за отклики, ... это уже не молчание, что хорошо.

Добавлено @ 18:24
Цитата
Нужно чтобы мне на флэш ничего не отсылалось, а всего лишь симитировалось нажатие на кнопки.

Но при этом, не исключаю чтобы паскаль имел адрес откуда запускается флэш на компе.
То есть, тот "получатель" о котором говорит Snowy

Автор: Snowy 25.2.2005, 07:56
Цитата(Slavik @ 24.2.2005, 18:16)
Key.addListener(this);

Ну сам подумай. Что ты делаешь в этой строке?
Здесь ты определяешь листенер, который будет слушать посылаемые ему события.
Не будет события - он не сработает.
Не будет события - он просто не узнает о факте нажатия клавиш.
Поэтому ему нужно сказать: "Произошло событие WM_KEYDOWN".
Чтобы послать клавиши твоей флэшке, нужно знать хотя бы часть заголовка окна программы, в которой она крутится.

Автор: Slavik 25.2.2005, 11:30
Цитата
Здесь ты определяешь листенер, который будет слушать посылаемые ему события.

Я не спорю, а просто спрашиваю, не все ли равно я пальцем кнопку нажму или программа паскаля это сдеает за меня? Зачем точно указывать адрес? Если окно флэшки будет активным на данный момент.

Чтобы послать клавиши твоей флэшке, нужно знать хотя бы часть заголовка окна программы, в которой она крутится.
Да нет проблем. Мне все равно как. Допустим "game". Лишь бы уже работало... : ) А то уже почти неделю лажу по форумам, спрашиваю, никто примерного алгоритма дать неможет. Все для прожвинутых программистов расчитано.

То есть, я уже согласен на все о чем ты говоришь. Пусть будет точный адрес где она установлена, название и т.д. Лишь бы уже это научился делать как то... smile : )
Но пример мне нужен именно рабюочий... чтобы я мог его сам просмотреть у себя.
Если надо, могу ролик флэш для пробы прикрепить вам. После нажатия на "abc" он кое что проиграет.





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)