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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 17:47   #1
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию Эмуляция клика мыши в чужом окне

Прочитал много тем, много погуглил.
В итоге, нажатие клавиш в программу передаются, а клики мыши - нет.
Для тестирования использовал Калькулятор (win7) с координатами 0;0.
Моя форма имеет вид:

Калькулятор (находится в левом верхнем углу экрана):

Кликнул 2 раза на вторую кнопку в своей форме:

Как мы видим, 2 раза ввелась единица (1).

При клике на первую, ничего не происходит.

Процедура обработки нажатия клавиши "Нажимаем в чужом окне кнопки":
PHP код:
procedure TFormMain.Button1Click(SenderTObject);
var
  
handlHWND;
begin
  handl 
:= FindWindow(nilPChar(Edit1.Text));
  if 
handl <> 0 then
    Panel1
.Color := clLime
    
else
    
Panel1.Color := clRed;

  
// PostMessage(handl, $0102, ord('1'), 0);
  
PostMessage(handlWM_KEYDOWNord('1'), 0);
  
// PostMessage(handl, WM_KEYUP, ord('1'), 0);

end
Процедура обработки нажатия клавиши "Кликаем в чужом окне мышью":
PHP код:
procedure TFormMain.Button4Click(SenderTObject);
var
  
handlHWND;
begin
  handl 
:= FindWindow(nilPChar(Edit1.Text));
  if 
handl <> 0 then
    Panel1
.Color := clLime
    
else
    
Panel1.Color := clRed;

  
SendMessage(handlWM_LBUTTONDOWN1010);
  
SendMessage(handlWM_LBUTTONUP1010);

  
SendMessage(handlWM_LBUTTONDBLClK1010);

  
// PostMessage(handl, WM_LBUTTONDOWN, 0,(83 shl 16)+ 219);
  // PostMessage(handl, WM_LBUTTONUP, 0,(83 shl 16)+ 219);

  // SendMessage(handl, WM_LBUTTONDOWN, MK_LBUTTON, 10 + 10 shl 16);
  // SendMessage(handl, WM_LBUTTONUP, MK_LBUTTON, 10 + 10 shl 16);

  // PostMessage(handl, WM_LBUTTONDOWN, 0, 10 + 10 shl 16);
  // PostMessage(handl, WM_LBUTTONUP, 0, 10 + 10 shl 16);
end
Вроде как должно меню открыться, а ведь оно не происходит....
0_o
MyIE вне форума Ответить с цитированием
Старый 02.10.2011, 18:07   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

У меню другой хендл. Его надо найти с помощью FindWindowEx. WinSpy++ или Spy от MSVC должны помочь разобраться.

Upd: Хмм... Сейчас сам заглянул в структуру калькулятора... Наврал я вам про меню. Под него не выделяется отдельное окошко. Кликать пункты меню можно через WinAPI.
Меню не входит в эту область фактически. Точка (0, 0) находится сразу под меню.

Последний раз редактировалось TwiX; 02.10.2011 в 18:22.
TwiX вне форума Ответить с цитированием
Старый 02.10.2011, 21:22   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,792
По умолчанию

Я просто создаю списко процессов:
Код:
//----- создаём список процессов -----------------------------------------------
procedure TForm1.CreateSps;
var Wnd:hWnd;
    buff:array[0..127] of Char;
begin
   iprc:=nil;
   Wnd:=GetWindow(Handle,gw_HWndFirst);
   while Wnd<>0 do
   begin//только видимые окна
      if(Wnd<>Application.Handle)and//не показываем cобственное окно
      IsWindowVisible(Wnd)and//не показываем невидимые окна
      (GetWindow(Wnd,gw_Owner)=0)and//не показываем дочернии окна
      (GetWindowText(Wnd,buff,sizeof(buff))<>0)then
      begin
         GetWindowText(Wnd,buff,sizeof(buff));
         if(Pos('Paint',StrPas(buff))<>0)then iprc:=PChar(StrPas(buff));
      end;
      Wnd:=GetWindow(Wnd,gw_hWndNext);
   end;
   if(iprc<>nil)then KillProgram(nil,iprc);//если такое окно найдено - закрываем его
end;
нахожу нужный процесс, открываю его окно (ALT+TAB
Код:
//----- нажимаем ALT+TAB -------------------------------------------------
      keybd_event(18,0,0,0);
      keybd_event(9,0,0,0);
      keybd_event(9,0,KEYEVENTF_KEYUP,0);
      keybd_event(18,0,KEYEVENTF_KEYUP,0);
и нажимаю в нём нужные клавиши или щёлкаю мышью. работа безупречна
Код:
SetCursorPos(190,105);//текущее положение мыши
      Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
но если много клавиш надо нажать или кликов мышью - надо ставить в таймер с интервалом в 2-3 секунды, иначе не все программы успевают обрабатывать быстрые клики мышкой.
Я работал автоматически в Paint'е. там надо тоже было разбираться с положением клавиш или где галочки ставить для невидимости фона
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 02.10.2011 в 21:25.
NetSpace вне форума Ответить с цитированием
Старый 02.10.2011, 21:32   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

меню вызывается при клике клавиши "Alt"
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 02.10.2011, 22:06   #5
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
и нажимаю в нём нужные клавиши или щёлкаю мышью. работа безупречна
За исключением одного маленького минусика... Нельзя в это время ничего делать за компом :D
TwiX вне форума Ответить с цитированием
Старый 02.10.2011, 23:06   #6
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

NetSpace, я лишь привел пример, естественно мне не нужна программа кликающая по калькулятору.
Мне необходима программа которая сможет кликать в любом окне, не вызывая его (оставляя свернутым). Соответственно Mouse_Event не подходит.

JUDAS, вызов меню при помощи клавиши мне так же не подходит, так как в моем случае мне необходимо эмуляровать нажатия клавишь, а на данном примере я лишь хочу разобраться, почему у меня это не получается.

TwiX, я пытался кликать и по цифрам, аналогично рузультата нет.
0_o
MyIE вне форума Ответить с цитированием
Старый 02.10.2011, 23:16   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Мне необходима программа которая сможет кликать в любом окне, не вызывая его (оставляя свернутым)
http://www.transl-gunsmoker.ru/2011/...late-user.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 03.10.2011, 01:32   #8
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Кликаем по кнопке ОК в cmd ("Выполнить..."). С калькулятором посложнее. Там у кнопок нет названия (название можно посмотреть в прогах, которые я уже называл)
Код:
  wnd:=FindWindow(nil, 'Выполнить');
  wnd:=FindWindowEx(wnd, 0, nil, 'ОК');
  SendMessage(wnd, WM_LBUTTONDOWN, 10, 10);
  SendMessage(wnd, WM_LBUTTONUP, 10, 10);
TwiX вне форума Ответить с цитированием
Старый 05.10.2011, 14:47   #9
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

Ну никак у меня не получается объяснить, что мне нужно с первого раза)
Мне не обязательно надо кликать по кнопке, это могут быть и графические элементы.

вопрос вот в чем: как произвести клик мышью в чужом окне по координатам, не активировав его при этом?
0_o
MyIE вне форума Ответить с цитированием
Старый 05.10.2011, 15:32   #10
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
не активировав его при этом
а такое вообще возможно, как ты себе представляешь клик мышкой в не активное окно? Такого физически быть не может, может прога и игнорирует посылаемые тобой сообщения, т.к. это 100% не может быть нажато юзером.
А в активном окне получается кликнуть?
fate вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие кнопки мыши в чужом окне gufon Общие вопросы Delphi 2 29.06.2011 21:03
Эмуляция действий мыши в свернутом окне senia Win Api 12 18.11.2010 16:38
Эмуляция клика мыши в C# GApe Общие вопросы C/C++ 0 04.05.2010 20:40
Эмуляция нажатия CTRL-V в чужом окне ]Wowan[ Общие вопросы Delphi 0 25.04.2009 18:42
Эмуляция клика мыши Stimer Win Api 1 05.02.2009 04:06