0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31

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

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

Студворк — интернет-сервис помощи студентам
Как соорудить программу, чтобы по нажатию ранее назначеной клавише происходила имитация нажатия некоторой комбинации клавиш. Пример: я нажимаю правый Ctrl программа сама имитирует 5 поочерёдных нажатий клавиши f7, причём с таймаутом 5 секунд. Во многом придёца разбираца, мот кто подкинет нужную литературку?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2010, 03:24
Ответы с готовыми решениями:

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

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

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

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

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

З.Ы кстати, в самом хелпе ты найдёшь все кода клавиш...
1
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
15.02.2010, 09:54
Лучший ответ Сообщение было отмечено как решение

Решение

Для имитации событий от клавиатуры можно посылать сообщения 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
Мммм... интересно... а как сделать как говорил Kapernik, чтобы между нажатиями был таймаут, заданный в секундах??

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

Решение

Цитата Сообщение от 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  [ТС]
Спасибо огромное. Может кто-нибудь подскажет как кнопке (Button1) назначить горячую клавишу и чтобы я сидел в другом открытом приложении и по вызову горячей кнопки выполнялись необходимые операции без скрытия выполняемой программы. Чтобы она работала фоново... Во! ))
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
17.02.2010, 17:42
Вот пример глобального хот кея.
Вложения
Тип файла: zip HotKey.zip (3.2 Кб, 1933 просмотров)
1
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
21.08.2010, 16:03
В программе с помощью keybd_event копирую некий текст, имитируя нажатие Сtrl+A и Ctrl+C, далее с помощью Clipboard.astext записываю в файл содержимое буфера обмена.
Проблема в том, что прога, видимо, сначала пытается записать в файл, а только потом обрабатывает keybd_event. В итоге в файл записывается содержимое буфера, которое было в нем до запуска программы, а текст выделяется и копируется уже после этого.
Пробывал вставить Application.ProcessMessages - не помогает.
0
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
21.08.2010, 16:05
amakl, без листингов ничего сказать нельзя
0
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
21.08.2010, 16:31
Код:

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}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
21.08.2010, 19:18
amakl, все зависит от объема копируемого текста и быстродействия твоего компа, проверено на практике...
Решения могу предложить 3:
1) вставка задержки (подбирается пробным путем);
2) замена "Ctrl+C" на "Ctrl+X" и перед выводом текста в файл переодичная проверка текста окна;
3) замена всех кейбордных операций на ф-ии работы с окнами (поиск окна), считывание текста и т.д.
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2010, 14:28
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}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
22.08.2010, 18:46
Mawrat, попробуй свой код на блокноте, в котором открыт файл на 2-3 МБ...
Delphi
1
2
3
  //Чтобы сообщения, посланные выше заданными командами, были
  //обработаны компонентами, необходимо выполнить:
  Application.ProcessMessages;
это бесполезная процедура в данном случае =)
только если заставить ее выполниться в контексте проги из которой копируем и дождаться от нее ответа
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2010, 20:53
Цитата Сообщение от Markus_13 Посмотреть сообщение
это бесполезная процедура в данном случае =)
только если заставить ее выполниться в контексте проги из которой копируем и дождаться от нее ответа
Я, как раз, и имел в виду случай, когда надо скопировать из той же прогри, которая вызывает эти функции:
Цитата Сообщение от Mawrat Посмотреть сообщение
И ещё надо иметь в виду, что, например, TMemo не умеет выделять весь текст по Ctrl+A. По Ctrl+A текст умеет выделять TRichEdit.
Если требуется копировать из другой проги - предварительно активировав её окно - тогда да - здесь придётся или делать задержку с эмпирически подобранным интервалом времени или надо как-то отслеживать состояние буфера обмена Windows.
0
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
23.08.2010, 01:30
Цитата Сообщение от Markus_13 Посмотреть сообщение
amakl, все зависит от объема копируемого текста и быстродействия твоего компа, проверено на практике...
Решения могу предложить 3:
1) вставка задержки (подбирается пробным путем);
2) замена "Ctrl+C" на "Ctrl+X" и перед выводом текста в файл переодичная проверка текста окна;
3) замена всех кейбордных операций на ф-ии работы с окнами (поиск окна), считывание текста и т.д.
3-й вариант самый удобный, но он к сожалению не подходит. Текст надо считать из чата покерного клуба, в котором оконные функции не отличают дескриптор дочерних окон от дескриптора основного окна, и найти окошко чата не получается. Находить его планировал, двигаясь по окну, имтируя нажатие tab. Может есть какие-то другие пути, чтобы найти дочернее окно в данной ситуации?

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

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

1-й вариант с задержкой попробывал - работает.
Вопрос - насколько надежен данный метод?
На других компах с меньшим быстродействием может не сработать?
Могут ли быть ситуации (например, большая нагрузка на процессор), когда метод не сработает?
Естественно могут быть ситуации когда данный метод не сработает...
1
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
24.08.2010, 02:14
Цитата Сообщение от Markus_13 Посмотреть сообщение
В таком случае - наилучший вариант считывать приходящие данные от сервера
Расшифровывать протоколы с сервера тоже не эффективно - клиентская часть программы очень часто обновляется, и протоколы соответственно меняются.
Придется, видимо, ставить большой sleep.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.08.2010, 02:14
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru