![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Шурик |
|
|||
|
Unregistered |
Доброе время суток !
Помогите плиз кто могёт !!! У меня такая проблема: где только я ни искал как послать приложению нажатия клавиш, ничего путного, т.е. что-бы ето действительно работало - я не нашел. пробовал SendMessage пробовал keybd_event (Проверял все ето дело на блокноте) Но послать могу только VK_RETURN (ENTER) и все ... все остальное, что я посылаю - игнорируется. А вообще проблема в том, что есть одна программулина которая требует при запуске имя и пароль, но мне надо чтоб она на серваке работала днем и ночью - и если комп перезагрузится (мало ли что), то чтобы она сама запустилась. Вот и решил я написать прогу - которая бы при старте компа сама за меня логинилась. Я связался с разработчиками - обещали сделать, но когда ...... а мне срочно надо ... помогите кто чем может ... |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Ваша проблема в неправильном определении дискриптора, куда Вы через SendMessage() посылаете сообщение.
-------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| Шурик |
|
|||
|
Unregistered |
Если бы проблема была в дескрипторе, то у меня и VK_RETURN не посылался бы(наверное
TheHandle:=FindWindow(nil,'Безымянный - Блокнот'); А потом работаю с етим Handl'ом через SendMessage. А keybd_event - просто активному окну посылает, как я понял. Но в любом случае не прокатывает. Я где то видел, в каком-то форуме кажется, что надо посылать ещё и именно в редактируемое окно, но там етот вопрос так и не был до конца освещен. Если знаете, то может просто кусок кода покажете, плиз ? |
|||
|
||||
| Шурик |
|
|||
|
Unregistered |
У меня все заработало, спасибо за внимание.
Просто параметры функции keybd_event не были правильно описаны, они везде так описаны, видимо их испытывали только на VK_RETURN Если кому интересно - Вырезка из oдного FAQ (http://faqs.org.ru/progr/pascal/delphi_chainik2.htm): "Нажимаем" клавиши в Блокноте (уже запущенном): uses Sendkey; {описан ниже} procedure TForm1.Button1Click(Sender: TObject); var h: HWND; begin h := FindWindow('Notepad', nil); // ищем окно Блокнота SendMessage(h, WM_SYSCOMMAND, SC_HOTKEY, h); // активизируем его PlayKeys(StrToKeys('abcdef')); // нажимаем клавиши SendMessage(Handle, WM_SYSCOMMAND, SC_HOTKEY, Handle); // возвращаем фокус end; Коды vk_ клавиш можно найти в Win32 Programmer's Reference (win32.hlp): Virtual-Key Codes. {В дельфи не описаны коды клавиш ['A'..'Z'] и ['0'..'9'], их получают с помощью Ord, например, Ord('A'), Ord('9')}. Символы из верхнего ряда клавиатуры посылаются с нажатым Shift. Заметим, что символы в локальной кодировке могут быть посланы после переключения кодировки в активном приложении, например, если перключатель (switch) Control-Shift, то это: PlayKeys(Chr(vk_control)+#0+Chr(vk_shift)+#0); {downkey = #0}; --- unit Sndkey.pas --- unit sndkey; interface uses Windows, Messages; const {VK constants missing from windows.pas} VK_SEMICOLON = 186; {;} VK_EQUAL = 187; {=} VK_COMMA = 188; {,} VK_MINUS = 189; {-} VK_PERIOD = 190; {.} VK_SLASH = 191; {/} VK_BACKQUOTE = 192; {`} VK_LEFTBRACKET = 219; {[} VK_BACKSLASH = 220; {\} VK_RIGHTBRACKET = 221; {]} VK_QUOTE = 222; {'} downkey = #0; upkey = Chr(KEYEVENTF_KEYUP); {#2} procedure PlayKeys(const keys: String); function StrToKeys(const s: String): String; {Alt-F4: PlayKeys(Chr(vk_menu)+#0+Chr(vk_f4)+#0+Chr(vk_f4)+#2+Chr(vk_menu)+#2)} {"exit"<return>: PlayKeys(StrToKeys('exit'+chr(vk_return)));} {"EXIT": PlayKeys(Chr(vk_shift)+downkey+StrToKeys('exit')+Chr(vk_shift)+upkey));} {or short form: PlayKeys(Chr(vk_shift)+#0+StrToKeys('exit'));} implementation function StrToKeys; {keystroke for alone keys} var i: Longint; c: Char; begin for i := 1 to Length(s) do begin c := s[i]; if c in ['a'..'z'] then {Upper} c := Chr(Ord© and not $20); Result := Result + c + downkey + c + upkey; end; end; procedure PlayKeys; const ExtendedKeys : set of byte = [ vk_up, vk_down, vk_left, vk_right, vk_home, vk_end, vk_prior, vk_next, vk_insert, vk_delete]; var i, ips : Longint; fb, sb: Byte; keysdown: String; procedure keybd (vk, kp : Byte); begin if vk in ExtendedKeys then kp := kp + KEYEVENTF_EXTENDEDKEY; keybd_event(vk, MapVirtualKey(vk, 0), kp, 0); end; begin keysdown := ''; for i := 1 to Length(keys) div 2 do begin fb:= Ord(keys[2*i -1]); sb:= Ord(keys[2*i]); if sb = Ord(downkey) then keysdown := keysdown + Chr(fb) else begin ips := pos(Chr(fb), keysdown); if ips > 0 then Delete(keysdown, ips, 1) else Continue; end; keybd(fb, sb); end; {Autocomplete} for i := 1 to Length(keysdown) do keybd(Ord(keysdown[i]), Ord(upkey)); end; end. --- EOF unit Sndkey.pas --- Leonid Troyanovsky <[email protected]> |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Вот именно, как я и говорил, не тот дискриптор Вы посылаете сообщение. Сообщение надо посылать не на дискриптор блокнота-приложения, а на дискриптор окна Edit, в котором Вы как раз и набираете текст. Если всё это непонятно, загрузите WinSight и посмотрите иерархию объектов внутри блокнота и всё будет понятно. В случае с блокнотом сообщение надо посылать не на TheHandle а на GetWindow(TheHandle,GW_CHILD) -------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |