Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2012, 05:59   #1
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию Имитация нажатия клавиш

Доброго времени суток всем.

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

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

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var h:hwnd;p:pchar;mk:Cardinal;
begin
 memo1.Lines.LoadFromFile('settings.txt');
 ShellExecute(Handle, 'open',
  pChar(memo1.Lines[3]), nil, nil, SW_SHOWNORMAL);
  // Меняем активное окно
sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,0,0);
sendmessage(findwindow(nil,'EMCO'),wm_activate,1,0) ;
timer1.Enabled:=false;
// Имитация нажатия клавиш для входа в Управляющую систему
//keybd_event(VK_DOWN, 0, 0, 0);
//Keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
//Keybd_event(VK_INSERT, 0, 0, 0);
//Keybd_event(VK_INSERT, 0,KEYEVENTF_KEYUP, 0);
Нижние строчки -нажатие клавиш, закомментрированны для проверки, становится ли окно ЧУЖОЙ программы активным. Определил, что эмитация идет в моем окне, т.к. после прогона программы в МЕМО1 указатель курсора уезжал на строчку вниз(Соответствует нажатию стрелки вниз).

У меня будет более 20 нажатий клавиш, в различных частях различных окон. Может кто знает метод попроще?

П.с. прошу прощения за вторую подряд тему, но правила форума жестко регламентируют количество решаемых вопросов на одну тему.
UPD.
Нужно было использовать POSTmessage.
Изображения
Тип файла: jpg Безымянный.jpg (112.2 Кб, 132 просмотров)
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет

Последний раз редактировалось xaero93; 27.10.2012 в 10:09.
xaero93 вне форума Ответить с цитированием
Старый 27.10.2012, 10:40   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,0,0);
Вот эта строчка совсем необязательна, имхо, так как в следующей Вы делаете активным другое окно, а в своей форме никаких действий не производите.
А так - не знаю, в чем дело, но вроде клавиши срабатывают нормально в открываемом окне (проверял опять же на Екселе, но с Вашими параметрами:

Код:
sendmessage(findwindow(nil,'EMCO'),wm_activate,1,0) ;
ну и плюс дописал от себя пару нажатий вправо -активная ячейка в таблице сместилась согласно алгоритму).

Выскажу предположение, что нужно выбирать не только окно формы, но компонент на запущенной форме.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 27.10.2012, 13:29   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сначала внимательно прочитайте для чего служит WM_ACTIVATE а потом почитайте про SetForegroundWindow()
waleri вне форума Ответить с цитированием
Старый 28.10.2012, 16:21   #4
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию

Нашел ошибку, код уже переписал. он видоизменился. Программа почти на финальной стадии.
Код:
f:=findwindow('NC2000 (c) EMCO','WinNC SINUMERIK 840D TURN (c) Emco');
Sleep(2000);
SENDMessage(f, WM_KEYDOWN, VK_F10,0);
SENDMessage(f, WM_KEYup,VK_F10, 0);
Окно находится нормально, проверял оператором условия f<>0
Дайте предположение, почему может не отправляться в найденное приложение нажатие клавиши Ф10?
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет
xaero93 вне форума Ответить с цитированием
Старый 28.10.2012, 16:32   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ммм... в заданном приложении нет обработки клавиши ф10?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 28.10.2012, 16:40   #6
xaero93
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 53
По умолчанию

Хорошая попытка, но если нажимать Ф10 вручную, то действие совершается

UPD

Проверил, ниодна Ф клавиша не работает, хотя действия на них назначены. Могу приложить скрин программы, если необходимо
Еще круче, нажатие num клавиш тоже не происходит
В чем может быть причина?

Уже и не знаю, что можно предположить: Такое ощущение, что мессаги до него не доходят, еще раз перепроверил, находится ли окно. В какую сторону можно поглядеть?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var h,f:hwnd;p:pchar;mk:Cardinal;
begin
sleep (1000)    ;
Label2.Caption:='Чтение параметров настройки';
 memo1.Lines.LoadFromFile('settings.txt');
 ShellExecute(Handle, 'open',
  pChar(memo1.Lines[3]), nil, nil, SW_SHOWNORMAL);
  // Меняем активное окно
//sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,0,0);
sendmessage(findwindow(#32770,'Launch EMCO Control'),wm_activate,1,0) ;
timer1.Enabled:=false;
// Имитация нажатия клавиш для входа в Управляющую систему
sleep(2000);
Label2.Caption:='Запуск управляющей систмы';
h:=findwindow(nil,'Launch EMCO Control');
PostMessage(h, WM_KEYDOWN, VK_DOWN, 0);
PostMessage(h, WM_KEYup, VK_DOWN, 0);
Sleep(1000);
Label2.Caption:='Выбор управляющей систмы';
PostMessage(h, WM_KEYDOWN, VK_Return, 0);
PostMessage(h, WM_KEYup, VK_Return, 0);
sleep(2000);
Label2.Caption:='Загрузка управляющей систмы' ;
f:=findwindow('NC2000 (c) EMCO','WinNC SINUMERIK 840D TURN (c) Emco');
Sleep(2000);
SENDMessage(f, WM_KEYDOWN, VK_NUMPAD2,0);
SENDMessage(f, WM_KEYup,VK_NUMPAD2, 0);
Sleep(2000);
SENDMessage(f, WM_KEYDOWN, VK_NUMPAD2,0);
SENDMessage(f, WM_KEYup,VK_NUMPAD2, 0);
Sleep(2000);
SENDMessage(f, WM_KEYDOWN, VK_NUMPAD2,0);
SENDMessage(f, WM_KEYup,VK_NUMPAD2, 0);
Sleep(2000);
SENDMessage(f, WM_KEYDOWN, VK_NUMPAD2,0);
SENDMessage(f, WM_KEYup,VK_NUMPAD2, 0);
Sleep(2000);
SENDMessage(f, WM_KEYDOWN, VK_NUMPAD2,0);
SENDMessage(f, WM_KEYup,VK_NUMPAD2, 0);

А чтобы послать мессагу нужно возвращать активность главной форме или нет?

Происходит какая-то ерунда. Переписал код вот таким образом. теперь все работает.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var h,f:hwnd;p:pchar;mk:Cardinal;
begin
sleep (1000)    ;
Label2.Caption:='Чтение параметров настройки';
 memo1.Lines.LoadFromFile('settings.txt');
 ShellExecute(Handle, 'open',
  pChar(memo1.Lines[3]), nil, nil, SW_SHOWNORMAL);
  // Меняем активное окно
//sendmessage(findwindow('TFORM1','Form1'),WM_ACTIVATE,0,0);
sendmessage(findwindow(#32770,'Launch EMCO Control'),wm_activate,1,0) ;
timer1.Enabled:=false;
// Имитация нажатия клавиш для входа в Управляющую систему
sleep(2000);
Label2.Caption:='Запуск управляющей систмы';
h:=findwindow(nil,'Launch EMCO Control');
PostMessage(h, WM_KEYDOWN, VK_DOWN, 0);
PostMessage(h, WM_KEYup, VK_DOWN, 0);
Sleep(1000);
Label2.Caption:='Выбор управляющей систмы';
PostMessage(h, WM_KEYDOWN, VK_Return, 0);
PostMessage(h, WM_KEYup, VK_Return, 0);
sleep(2000);
Label2.Caption:='Загрузка управляющей систмы' ;
f:=findwindow('NC2000 (c) EMCO','WinNC SINUMERIK 840D TURN (c) Emco');
Sleep(2000);
keybd_event(VK_tab, 0, 0, 0);
Keybd_event(VK_tab, 0, KEYEVENTF_KEYUP, 0);
Sleep(2000);
keybd_event(VK_F10, 0, 0, 0);
Keybd_event(VK_F10, 0, KEYEVENTF_KEYUP, 0);
Sleep(2000);
keybd_event(VK_F3, 0, 0, 0);
Keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0);
Sleep(2000);
keybd_event(VK_Return , 0, 0, 0);
Keybd_event(VK_Return, 0, KEYEVENTF_KEYUP, 0);
Sleep(2000);
keybd_event(VK_Return, 0, 0, 0);
Keybd_event(VK_Return, 0, KEYEVENTF_KEYUP, 0);
И вопрос в догонку. Суть программы: запустить программу Emco. В ней нужно прожать некоторую комбинацию клавиш (Виртуально), без участия пользователя. Как такое можно реализовать?
З.Ы. Сильно не бейте за некрасивый код, мне всего лишь 15 лет

Последний раз редактировалось xaero93; 28.10.2012 в 20:21.
xaero93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитация нажатия клавиш Miha85193 Общие вопросы Delphi 41 22.05.2012 02:58
Имитация нажатия комбинации клавиш! stalsoft C# (си шарп) 2 24.06.2011 00:13
имитация нажатия клавиш RAVAL(c) HTML и CSS 10 07.02.2011 12:29
Имитация нажатия клавиш в играх. simtiko Общие вопросы Delphi 2 01.06.2010 15:02
Имитация нажатия клавиш Air Свободное общение 28 04.02.2010 12:38