Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/638: Рейтинг темы: голосов - 638, средняя оценка - 4.89
0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31
1

Имитация нажатий клавиш клавиатуры

15.02.2010, 03:24. Показов 121331. Ответов 38

Author24 — интернет-сервис помощи студентам
Как соорудить программу, чтобы по нажатию ранее назначеной клавише происходила имитация нажатия некоторой комбинации клавиш. Пример: я нажимаю правый Ctrl программа сама имитирует 5 поочерёдных нажатий клавиши f7, причём с таймаутом 5 секунд. Во многом придёца разбираца, мот кто подкинет нужную литературку?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2010, 03:24
Ответы с готовыми решениями:

Имитация нажатия клавиш клавиатуры
Всем привет! Прошу помочь мне. Я искал в интернете но там как то сложно. Я думаю можно обойтись...

Эмуляция нажатий клавиш
У меня есть залогированы клавиши в блокноте в таком виде(много): Как мне заставить их из...

Считывание и обработка нажатий клавиш
Всем привет! Мне нужно написать маленькую программку, которая выполняла бы следующую операцию:...

Подсчет нажатий клавиш на клавиатуре
Приветствую. Понадобилось сделать сабж, но дело тут вот в чем. Счетчик должен плюсовать только...

38
Junior Developer
44 / 44 / 7
Регистрация: 08.06.2009
Сообщений: 261
15.02.2010, 08:33 2
нужная литература это сам Делфийский хелп... по словам VK_Key
или копай в сторону виртуальной клавиатуры...

но мне кажется что твоя задача не выполнима(хотя может просто чего то не знаю..))) ), чтобы повесить на одну клавишу 7 нажатий... хотя... кто его знает..)))

З.Ы кстати, в самом хелпе ты найдёшь все кода клавиш...
1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
15.02.2010, 09:54 3
Лучший ответ Сообщение было отмечено как решение

Решение

Для имитации событий от клавиатуры можно посылать сообщения WM_KEYDOWN и WM_KEYUP. Либо есть более удобный способ - применение процедуры keybd_event():
Delphi
1
keybd_event(bVk: Byte; bScan: Byte; dwFlags, dwExtraInfo: DWORD);
Объявлена она в модуле Windows.
bVk - виртуальный код клавиши.
bScan - аппаратный скан-код. Устанавливаем = 0.
dwFlags - флаг, задающий нажатие или отпускание клавиши. Если требуется, имитация нажатия: dwFlags = 0, имитация отпускания: dwFlags = KEYEVENTF_KEYUP.
Ещё этот параметр может быть установлен = KEYEVENTF_EXTENDEDKEY. - Это значение использовать не будем. Оно связано со скан-кодом.
dwExtraInfo - дополнительные данные, связанные с событием от клавиатуры. Установить = 0.
---
Например, имитация 5 нажатий клавиши F7:
Delphi
1
2
3
4
5
  //Пять нажатий (нажатие + отпускание) клавиши F7
  for i := 1 to 5 do begin
    keybd_event(VK_F7, 0, 0, 0); //Нажатие F7.
    keybd_event(VK_F7, 0, KEYEVENTF_KEYUP, 0); //Отпускание F7.
  end;
Так как имитировать можно и нажатие и отпускание, то для имитации доступны любые комбинации, например: Ctrl+Ins, Ctrl+z, Ctrl+Shift+z и т. д.
Например, имитация Ctrl+Shift+z:
Delphi
1
2
3
4
5
6
7
  keybd_event(VK_LCONTROL, 0, 0, 0); //Нажатие левого Ctrl.
  keybd_event(VK_LSHIFT, 0, 0, 0); //Нажатие левого Shift.
  keybd_event(Ord('Z'), 0, 0, 0); //Нажатие 'z'.
 
  keybd_event(Ord('Z'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 'z'.
  keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0); //Отпускание левого Shift.
  keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0); //Отпускание левого Ctrl.
Ещё следует обратить внимание на такой момент. Если требуется имитировать ввод буквы в нижнем регистре, например: 's', тогда код соответствующей клавиши надо задать через Ord('S'), а не Ord('s'). Если же требуется задать ввод буквы в верхнем регистре, понадобится имитировать нажатие клавиши Shift и 's'.
Например, имитация ввода в Мемо слова 'Start':
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  //Устанавливаем фокус ввода на Мемо1.
  Memo1.SetFocus;
  //Ввод 'S'.
  keybd_event(VK_LSHIFT, 0, 0, 0); //Нажатие левого Shift.
  keybd_event(Ord('S'), 0, 0, 0); //Нажатие 's'.
  keybd_event(Ord('S'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 's'.
  keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0); //Отпускание левого Shift.
  //Ввод 't'
  keybd_event(Ord('T'), 0, 0, 0); //Нажатие 't'.
  keybd_event(Ord('T'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 't'.
  //Ввод 'a'
  keybd_event(Ord('A'), 0, 0, 0); //Нажатие 'a'.
  keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 'a'.
  //Ввод 'r'
  keybd_event(Ord('R'), 0, 0, 0); //Нажатие 'r'.
  keybd_event(Ord('R'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 'r'.
  //Ввод 't'
  keybd_event(Ord('T'), 0, 0, 0); //Нажатие 't'.
  keybd_event(Ord('T'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 't'.
При работе с keybd_event надо следить за последовательностью нажатий/отпусканий - каждому нажатию должно соответствовать отпускание (не обязательно последовательно, как например в случае имитации Ctrl+Shift+z и пр.). Если, выполнить два раза подряд отпускание клавиши - второе отпускание не произведёт никаких действий.
Коды виртуальных клавиш

Virtual Key Code Corresponding key

VK_LBUTTON Left mouse button
VK_RBUTTON Right mouse button
VK_CANCEL Control+Break
VK_MBUTTON Middle mouse button
VK_BACK Backspace key
VK_TAB Tab key
VK_CLEAR Clear key
VK_RETURN Enter key
VK_SHIFT Shift key
VK_CONTROL Ctrl key
VK_MENU Alt key
VK_PAUSE Pause key
VK_CAPITAL Caps Lock key
VK_KANA Used with IME
VK_HANGUL Used with IME
VK_JUNJA Used with IME
VK_FINAL Used with IME
VK_HANJA Used with IME
VK_KANJI Used with IME
VK_CONVERT Used with IME

VK_NONCONVERT Used with IME
VK_ACCEPT Used with IME
VK_MODECHANGE Used with IME
VK_ESCAPE Esc key
VK_SPACE Space bar
VK_PRIOR Page Up key
VK_NEXT Page Down key
VK_END End key
VK_HOME Home key
VK_LEFT Left Arrow key
VK_UP Up Arrow key
VK_RIGHT Right Arrow key
VK_DOWN Down Arrow key
VK_SELECT Select key
VK_PRINT Print key (keyboard-specific)
VK_EXECUTE Execute key
VK_SNAPSHOT Print Screen key
VK_INSERT Insert key
VK_DELETE Delete key
VK_HELP Help key

VK_LWIN Left Windows key (Microsoft keyboard)
VK_RWIN Right Windows key (Microsoft keyboard)
VK_APPS Applications key (Microsoft keyboard)
VK_NUMPAD0 0 key (numeric keypad)
VK_NUMPAD1 1 key (numeric keypad)
VK_NUMPAD2 2 key (numeric keypad)
VK_NUMPAD3 3 key (numeric keypad)
VK_NUMPAD4 4 key (numeric keypad)
VK_NUMPAD5 5 key (numeric keypad)
VK_NUMPAD6 6 key (numeric keypad)
VK_NUMPAD7 7 key (numeric keypad)
VK_NUMPAD8 8 key (numeric keypad)
VK_NUMPAD9 9 key (numeric keypad)

VK_MULTIPLY Multiply key (numeric keypad)
VK_ADD Add key (numeric keypad)
VK_SEPARATOR Separator key (numeric keypad)
VK_SUBTRACT Subtract key (numeric keypad)
VK_DECIMAL Decimal key (numeric keypad)
VK_DIVIDE Divide key (numeric keypad)
VK_F1 F1 key
VK_F2 F2 key
VK_F3 F3 key
VK_F4 F4 key
VK_F5 F5 key
VK_F6 F6 key
VK_F7 F7 key
VK_F8 F8 key
VK_F9 F9 key
VK_F10 F10 key
VK_F11 F11 key
VK_F12 F12 key
VK_F13 F13 key
VK_F14 F14 key
VK_F15 F15 key

VK_F16 F16 key
VK_F17 F17 key
VK_F18 F18 key
VK_F19 F19 key
VK_F20 F20 key
VK_F21 F21 key
VK_F22 F22 key
VK_F23 F23 key
VK_F24 F24 key
VK_NUMLOCK Num Lock key
VK_SCROLL Scroll Lock key
VK_LSHIFT Left Shift key (only used with GetAsyncKeyState and GetKeyState)
VK_RSHIFT Right Shift key (only used with GetAsyncKeyState and GetKeyState)
VK_LCONTROL Left Ctrl key (only used with GetAsyncKeyState and GetKeyState)
VK_RCONTROL Right Ctrl key (only used with GetAsyncKeyState and GetKeyState)

VK_LMENU Left Alt key (only used with GetAsyncKeyState and GetKeyState)
VK_RMENU Right Alt key (only used with GetAsyncKeyState and GetKeyState)
VK_PROCESSKEY Process key
VK_ATTN Attn key
VK_CRSEL CrSel key
VK_EXSEL ExSel key
VK_EREOF Erase EOF key
VK_PLAY Play key
VK_ZOOM Zoom key
VK_NONAME Reserved for future use
VK_PA1 PA1 key
VK_OEM_CLEAR Clear key

---
Аналогично можно имитировать нажатия кнопок мыши. Для этого есть процедура mouse_event(dwFlags, dx, dy, dwData, dwExtraInfo: DWORD).
Значения флага dwFlags:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const
  {$EXTERNALSYM MOUSEEVENTF_MOVE}
  MOUSEEVENTF_MOVE            = $0001; { mouse move }
  {$EXTERNALSYM MOUSEEVENTF_LEFTDOWN}
  MOUSEEVENTF_LEFTDOWN        = $0002; { left button down }
  {$EXTERNALSYM MOUSEEVENTF_LEFTUP}
  MOUSEEVENTF_LEFTUP          = $0004; { left button up }
  {$EXTERNALSYM MOUSEEVENTF_RIGHTDOWN}
  MOUSEEVENTF_RIGHTDOWN       = $0008; { right button down }
  {$EXTERNALSYM MOUSEEVENTF_RIGHTUP}
  MOUSEEVENTF_RIGHTUP         = $0010; { right button up }
  {$EXTERNALSYM MOUSEEVENTF_MIDDLEDOWN}
  MOUSEEVENTF_MIDDLEDOWN      = $0020; { middle button down }
  {$EXTERNALSYM MOUSEEVENTF_MIDDLEUP}
  MOUSEEVENTF_MIDDLEUP        = $0040; { middle button up }
  {$EXTERNALSYM MOUSEEVENTF_WHEEL}
  MOUSEEVENTF_WHEEL           = $0800; { wheel button rolled }
  {$EXTERNALSYM MOUSEEVENTF_ABSOLUTE}
  MOUSEEVENTF_ABSOLUTE        = $8000; { absolute move }
12
1 / 1 / 1
Регистрация: 20.11.2009
Сообщений: 76
16.02.2010, 01:49 4
Мммм... интересно... а как сделать как говорил Kapernik, чтобы между нажатиями был таймаут, заданный в секундах??

Добавлено через 26 минут
И вопрос в какой это происходит процедуре и куда она "засовывается" ?
И как можно записать значение нажатой клавиши, ну чтобы программа считывала что ты нажал.
1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
16.02.2010, 08:33 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Matfak Посмотреть сообщение
а как сделать как говорил Kapernik, чтобы между нажатиями был таймаут, заданный в секундах??
Для этого, между вызовами keybd_event() или mouse_event(), можно вызывать процедуру Sleep(). - Она приостанавливает выполнение программы на заданное количество миллисекунд. Значение задержки в миллисекундах передаётся процедуре Sleep() в качестве параметра.
Но! В нашем случае, перед вызовом процедуры Sleep() надо обязательно вызвать метод: Application.ProcessMessages; - это позволит главному окну приложения обработать сообщения, посланные ему процедурой keybd_event(). Если этого не сделать - тогда все сообщения будут обработаны только после окончания нашей процедуры. Это означает, что все задержки по всем вызовам Sleep() внутри нашей процедуры просуммируются и в течение этого времени никаких изменений в реакции приложения (в том числе на экране, если задумано что-то выводить) не будет.
Цитата Сообщение от Matfak Посмотреть сообщение
И вопрос в какой это происходит процедуре и куда она "засовывается" ?
Код вызова keybd_event() можно размещать в любых частях кода. Например, в обработчике нажатия кнопки:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Устанавливаем фокус ввода на Мемо1.
  Memo1.SetFocus;
 
  //Ввод 'S'.
  keybd_event(VK_LSHIFT, 0, 0, 0); //Нажатие левого Shift.
  keybd_event(Ord('S'), 0, 0, 0); //Нажатие 's'.
  keybd_event(Ord('S'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 's'.
  keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0); //Отпускание левого Shift.
 
  //Позволяем нашему приложению обработать сообщения, отправленные через keybd_event().
  Application.ProcessMessages;
  //Пауза 1000 мсек = 1 сек.
  Sleep(1000);
 
  //Ввод 't'
  keybd_event(Ord('T'), 0, 0, 0); //Нажатие 't'.
  keybd_event(Ord('T'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 't'.
 
  Application.ProcessMessages;
  Sleep(1000);
 
  //Ввод 'a'
  keybd_event(Ord('A'), 0, 0, 0); //Нажатие 'a'.
  keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 'a'.
 
  Application.ProcessMessages;
  Sleep(1000);
 
  //Ввод 'r'
  keybd_event(Ord('R'), 0, 0, 0); //Нажатие 'r'.
  keybd_event(Ord('R'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 'r'.
 
  Application.ProcessMessages;
  Sleep(1000);
 
  //Ввод 't'
  keybd_event(Ord('T'), 0, 0, 0); //Нажатие 't'.
  keybd_event(Ord('T'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 't'.
end;
Цитата Сообщение от Matfak Посмотреть сообщение
И как можно записать значение нажатой клавиши, ну чтобы программа считывала что ты нажал.
Это другая задача. Если требуется отлавливать события от клавиатуры - для этого можно соответствующим образом настроить форму:
TForm.KeyPreview = True - в этом случае, события (OnKeyDown, OnKeyUp, OnKeyPress) сначала возникнут на уровне формы и лишь затем будут переданы на уровень компонентов, расположенных на форме.
5
0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31
17.02.2010, 03:20  [ТС] 6
Спасибо огромное. Может кто-нибудь подскажет как кнопке (Button1) назначить горячую клавишу и чтобы я сидел в другом открытом приложении и по вызову горячей кнопки выполнялись необходимые операции без скрытия выполняемой программы. Чтобы она работала фоново... Во! ))
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
17.02.2010, 17:42 7
Вот пример глобального хот кея.
Вложения
Тип файла: zip HotKey.zip (3.2 Кб, 1910 просмотров)
1
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
21.08.2010, 16:03 8
В программе с помощью keybd_event копирую некий текст, имитируя нажатие Сtrl+A и Ctrl+C, далее с помощью Clipboard.astext записываю в файл содержимое буфера обмена.
Проблема в том, что прога, видимо, сначала пытается записать в файл, а только потом обрабатывает keybd_event. В итоге в файл записывается содержимое буфера, которое было в нем до запуска программы, а текст выделяется и копируется уже после этого.
Пробывал вставить Application.ProcessMessages - не помогает.
0
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
21.08.2010, 16:05 9
amakl, без листингов ничего сказать нельзя
0
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
21.08.2010, 16:31 10
Код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var
  Str:string; 
 
begin
 //переключаюсь на нужное поле с текстом, имтируя ALT+TAB
 keybd_event(VK_MENU,0,0,0);  
 keybd_event(VK_TAB,0,0,0);
 keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0); 
 keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
  
 //Ctrl+A Ctrl+C
 keybd_event(VK_LCONTROL,0,0,0);            
 keybd_event(Ord('A'),0,0,0);
 keybd_event(Ord('A'),0,KEYEVENTF_KEYUP,0); 
 keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
 keybd_event(VK_LCONTROL,0,0,0);            
 keybd_event(Ord('C'),0,0,0);
 keybd_event(Ord('C'),0,KEYEVENTF_KEYUP,0); 
 keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
 
 //открываю файл и пишу в него содержимое буфера обмена, если в нем соответствующий формат
 assign(fl,'log.txt'); append(fl);
 if clipboard.hasformat(cf_text) then begin
  str:=Clipboard.astext;  writeln(fl,str) end
 else writeln(fl,'NO TEXT!!!'); 
 closefile(fl);
 
end.
0
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
21.08.2010, 19:18 11
amakl, все зависит от объема копируемого текста и быстродействия твоего компа, проверено на практике...
Решения могу предложить 3:
1) вставка задержки (подбирается пробным путем);
2) замена "Ctrl+C" на "Ctrl+X" и перед выводом текста в файл переодичная проверка текста окна;
3) замена всех кейбордных операций на ф-ии работы с окнами (поиск окна), считывание текста и т.д.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
22.08.2010, 14:28 12
Amakl, если перевод фокуса ввода на поле редактирования выполнен верно, то в таком виде заработает:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TForm1.Button2Click(Sender: TObject);
const
  FileName = 'log.txt';
var
  F : TextFile;
  S : string;
begin
  //переключаюсь на нужное поле с текстом, имтируя ALT+TAB
  keybd_event(VK_MENU,0,0,0);
  keybd_event(VK_TAB,0,0,0);
  keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
 
  //Ctrl+A Ctrl+C
  keybd_event(VK_LCONTROL,0,0,0);
  keybd_event(Ord('A'),0,0,0);
  keybd_event(Ord('A'),0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_LCONTROL,0,0,0);
  keybd_event(Ord('C'),0,0,0);
  keybd_event(Ord('C'),0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
 
  //Чтобы сообщения, посланные выше заданными командами, были
  //обработаны компонентами, необходимо выполнить:
  Application.ProcessMessages;
 
  //открываю файл и пишу в него содержимое буфера обмена, если в нем соответствующий формат
  AssignFile(F, FileName);
  if FileExists(FileName) then
    Append(F)
  else
    Rewrite(F)
  ;
  if clipboard.hasformat(cf_text) then begin
    S := Clipboard.astext;
    Writeln(F, S);
  end else
    Writeln(F, 'NO TEXT!!!')
  ;
 
  CloseFile(F);
end;
Str заменено на S, т. к. Str() - есть такая встроенная процедура в Pascal и в Delphi.
---
И ещё надо иметь в виду, что, например, TMemo не умеет выделять весь текст по Ctrl+A. По Ctrl+A текст умеет выделять TRichEdit.
0
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
22.08.2010, 18:46 13
Mawrat, попробуй свой код на блокноте, в котором открыт файл на 2-3 МБ...
Delphi
1
2
3
  //Чтобы сообщения, посланные выше заданными командами, были
  //обработаны компонентами, необходимо выполнить:
  Application.ProcessMessages;
это бесполезная процедура в данном случае =)
только если заставить ее выполниться в контексте проги из которой копируем и дождаться от нее ответа
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
22.08.2010, 20:53 14
Цитата Сообщение от Markus_13 Посмотреть сообщение
это бесполезная процедура в данном случае =)
только если заставить ее выполниться в контексте проги из которой копируем и дождаться от нее ответа
Я, как раз, и имел в виду случай, когда надо скопировать из той же прогри, которая вызывает эти функции:
Цитата Сообщение от Mawrat Посмотреть сообщение
И ещё надо иметь в виду, что, например, TMemo не умеет выделять весь текст по Ctrl+A. По Ctrl+A текст умеет выделять TRichEdit.
Если требуется копировать из другой проги - предварительно активировав её окно - тогда да - здесь придётся или делать задержку с эмпирически подобранным интервалом времени или надо как-то отслеживать состояние буфера обмена Windows.
0
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
23.08.2010, 01:30 15
Цитата Сообщение от Markus_13 Посмотреть сообщение
amakl, все зависит от объема копируемого текста и быстродействия твоего компа, проверено на практике...
Решения могу предложить 3:
1) вставка задержки (подбирается пробным путем);
2) замена "Ctrl+C" на "Ctrl+X" и перед выводом текста в файл переодичная проверка текста окна;
3) замена всех кейбордных операций на ф-ии работы с окнами (поиск окна), считывание текста и т.д.
3-й вариант самый удобный, но он к сожалению не подходит. Текст надо считать из чата покерного клуба, в котором оконные функции не отличают дескриптор дочерних окон от дескриптора основного окна, и найти окошко чата не получается. Находить его планировал, двигаясь по окну, имтируя нажатие tab. Может есть какие-то другие пути, чтобы найти дочернее окно в данной ситуации?

2-й вариант не совсем понял, но поскольку из окошка нельзя вырезать, он, видимо, не годится.

1-й вариант с задержкой попробывал - работает.
Вопрос - насколько надежен данный метод?
На других компах с меньшим быстродействием может не сработать?
Могут ли быть ситуации (например, большая нагрузка на процессор), когда метод не сработает?
0
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.08.2010, 10:15 16
amakl, а покер рум случаем не partypoker.com? А то, если что, могу исходники кинуть
0
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
23.08.2010, 12:21 17
iama,
рум FullTiltPoker
0
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
23.08.2010, 12:27 18
amakl, жаль, этот рум я не знаю
0
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
23.08.2010, 13:28 19
Текст надо считать из чата покерного клуба, в котором оконные функции не отличают дескриптор дочерних окон от дескриптора основного окна, и найти окошко чата не получается. Находить его планировал, двигаясь по окну, имтируя нажатие tab. Может есть какие-то другие пути, чтобы найти дочернее окно в данной ситуации?
В таком случае - наилучший вариант считывать приходящие данные от сервера.

1-й вариант с задержкой попробывал - работает.
Вопрос - насколько надежен данный метод?
На других компах с меньшим быстродействием может не сработать?
Могут ли быть ситуации (например, большая нагрузка на процессор), когда метод не сработает?
Естественно могут быть ситуации когда данный метод не сработает...
1
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
24.08.2010, 02:14 20
Цитата Сообщение от Markus_13 Посмотреть сообщение
В таком случае - наилучший вариант считывать приходящие данные от сервера
Расшифровывать протоколы с сервера тоже не эффективно - клиентская часть программы очень часто обновляется, и протоколы соответственно меняются.
Придется, видимо, ставить большой sleep.
0
24.08.2010, 02:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2010, 02:14
Помогаю со студенческими работами здесь

Эмуляция нажатий клавиш в браузерную строку.
Подскажите пожалуйста, как можно эмулировать нажатия клавиш в браузерную строку, если я знаю хендл...

Память процесса, эмуляция нажатий клавиш
1. Дайте плиз кто-нибудь пример или исходник с использованием ReadProcessMemory и...

Имитация нажатия клавиш
я пытаюсь написать бот для одной онлайн игры и в ней этот бот не работает, хотя сама игра работает...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru