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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 17:56   #1
senia
 
Регистрация: 23.12.2009
Сообщений: 7
По умолчанию Эмуляция действий мыши в свернутом окне

Как можно реализовать перемещение и нажатие клавиш мышки в свернутом окне.
senia вне форума Ответить с цитированием
Старый 23.12.2009, 18:32   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Код:
//Послать нажатие клавиш в программу Блокнот
procedure TForm1.Button1Click(Sender: TObject);
var wnd: HWND; i: Integer; s: string;
begin
wnd:=FindWindow('notepad', nil);
if wnd<>0 then
	begin
	wnd:=FindWindowEx(wnd, 0, 'Edit', nil);
	s:='Hello';
	for i:=1 to Length(s) do
		SendMessage(wnd, WM_CHAR, Word(s[i]), 0);
	// Simulate Return Key.
	PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
	// Simulate Space.
	PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);
	end;
end;
Ваше сообщение слишком короткое. Оно должно быть не менее 10 символов
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 23.12.2009, 18:40   #3
senia
 
Регистрация: 23.12.2009
Сообщений: 7
По умолчанию

Ну тут все понятно, а как насчет эмуляции кликов мышки в заданных координатах в пределах окна (свернутого)
senia вне форума Ответить с цитированием
Старый 23.12.2009, 18:59   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Получить дескриптор кнопки (или что там у Вас) и
Код:
  // hBtn - дескриптор кнопки
  SendMessage(hBtn, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hBtn, WM_LBUTTONUP, 0, 0);
Клик мышью, просто клик мышью
Код:
mouse_event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Кликнет, там где стоит курсор.

Последний раз редактировалось psycho-coder; 23.12.2009 в 19:02.
psycho-coder вне форума Ответить с цитированием
Старый 23.12.2009, 20:06   #5
senia
 
Регистрация: 23.12.2009
Сообщений: 7
По умолчанию

тут то все понятно, непонятно как заставить курсор кликать в том окне в котором мне нужно.

Цитата:
postmessage(H,WM_LBUTTONDOWN,0,(pt. x shl 16)+ pt.y);
postmessage(H,WM_LBUTTONUP,0,(pt.x shl 16)+ pt.y);
почему то не получаетсо

Последний раз редактировалось senia; 23.12.2009 в 20:32.
senia вне форума Ответить с цитированием
Старый 23.12.2009, 21:37   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

H - проверьте для начала, нашли-ли вы главное окно через findwidow или enumwindows.
...приведенный код с postmessage рабочий.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 23.12.2009 в 21:40.
raxp вне форума Ответить с цитированием
Старый 23.12.2009, 21:48   #7
senia
 
Регистрация: 23.12.2009
Сообщений: 7
По умолчанию

Цитата:
procedure TForm1.Button1Click(Sender: TObject);
var
H: HWND;
Pt:TPoint;

begin

pt.x:=300;
pt.y:=200;
H := findwindow ('notepad',nil);
if H <>0 then begin

postmessage(H,WM_LBUTTONDOWN,0,(pt. x shl 16)+ pt.y);
postmessage(H,WM_LBUTTONUP,0,(pt.x shl 16)+ pt.y);

end;
end;
В нотпаде все забито буквами, чтоб видеть, куда курсор прыгнул.
Но не роботает.
Окно находит.
senia вне форума Ответить с цитированием
Старый 23.12.2009, 22:16   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

хм... а кто фокус давать дочернему окну edit будет? если уж посылать, так хэндлу его посылать нужно... да, это тоже окно...
Код:
 postmessage(FindWindowEx(FindWindow('notepad', nil), 0, 'Edit', nil),WM_LBUTTONDOWN,0,(x shl 16)+ y);
 postmessage(FindWindowEx(FindWindow('notepad', nil), 0, 'Edit', nil),WM_LBUTTONUP,0, (x shl 16)+ y);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 19.10.2010, 09:28   #9
Nub
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 19
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
хм... а кто фокус давать дочернему окну edit будет? если уж посылать, так хэндлу его посылать нужно... да, это тоже окно...
Код:
 postmessage(FindWindowEx(FindWindow('notepad', nil), 0, 'Edit', nil),WM_LBUTTONDOWN,0,(x shl 16)+ y);
 postmessage(FindWindowEx(FindWindow('notepad', nil), 0, 'Edit', nil),WM_LBUTTONUP,0, (x shl 16)+ y);

Помогите, пожалуйста, разобраться с FindWindowEx и FindWindow. Задача та же. Клик мышкой в свёрнутом окне. На форме (ТfrmMain) компонент TPageControl, в первой вкладке TtabSheet ("Браузер и запуск") WebBrowser. В нём загружена флеш игра. Нужно кликнуть по заданным координатам на игрушке. Такой вариант работать отказывается.

Код:
procedure TfrmMain.Button3Click(Sender: TObject);
var
  Pt: TPoint;
  left, top:integer;

  begin
  left:=strtoint(Edit31.Text);
  top:=strtoint(Edit32.Text);
  {Позволим кнопке перерисоваться}
  Application.ProcessMessages;
  {Найдем координаты центра button 1}
  Pt.x := WebBrowser1.Left + left;
  Pt.y := WebBrowser1.Top + top + 25; //костыль в 25 от верхней границы

    {Преобразуем Pt к координатам экрана}
  Pt := ClientToScreen(Pt);
  {Преобразуем Pt к "mickeys" (аболютным координатам курсора мышки}
  Pt.x := Round(Pt.x * (65535 / Screen.Width));
  Pt.y := Round(Pt.y * (65535 / Screen.Height));


postmessage(frmMain.WebBrowser1.Handle,WM_MOVE,0,(Pt. x shl 16)+ Pt.y);
postmessage(frmMain.WebBrowser1.Handle,WM_LBUTTONDOWN,0,(Pt. x shl 16)+ Pt.y);
postmessage(frmMain.WebBrowser1.Handle,WM_LBUTTONUP,0,(Pt.x shl 16)+ Pt.y);
Насколько я понимаю, как раз из-за того, что не указано дочернее окно. Подскажите, как должно выглядеть клик мышкой в свёрнутом окне в моём случае. Вооружился WinSpy++.
Фактически путь выглядит таким образом:
ТfrmMain->TPageControl->TtabSheet->ShellEmbedding->Shell DocObject View->Internet Explorer_Server->MacromediaFlashPlayerActiveX
Вот что есть на самом деле:
Изображения
Тип файла: jpg winspy.jpg (103.4 Кб, 153 просмотров)

Последний раз редактировалось Nub; 19.10.2010 в 09:43.
Nub вне форума Ответить с цитированием
Старый 19.10.2010, 23:16   #10
Nub
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 19
По умолчанию

Господа, ну вот вроде так должно работать - но не хочет. Посмотрите, пожалуйста.

Код:
procedure TfrmMain.Button3Click(Sender: TObject);
var
  Pt: TPoint;
  left, top:integer;
  Wnd:HWnd;

  begin
  left:=strtoint(Edit31.Text);
  top:=strtoint(Edit32.Text);
  {Позволим кнопке перерисоваться}
  Application.ProcessMessages;
  {Найдем координаты центра button 1}
  Pt.x := WebBrowser1.Left + left;
  Pt.y := WebBrowser1.Top + top + 25; //костыль в 25 от верхней границы

  Pt := ClientToScreen(Pt);
  Pt.x := Round(Pt.x * (65535 / Screen.Width));
  Pt.y := Round(Pt.y * (65535 / Screen.Height));


Wnd:=FindWindow('TfrmMain',nil);
Wnd:=FindWindowEx(Wnd,0,'TPageContol',nil);
Wnd:=FindWindowEx(Wnd,0,'Shell Embedding',nil);
Wnd:=FindWindowEx(Wnd,0,'Shell DocObject View',nil);
Wnd:=FindWindowEx(Wnd,0,'Internet Explorer_Server',nil);
Wnd:=FindWindowEx(Wnd,0,'MacromediaFlashPlayerActiveX',nil);


postmessage(Wnd,WM_MOVE,0,(Pt. x shl 16)+ Pt.y);
postmessage(Wnd,WM_LBUTTONDOWN,0,(Pt. x shl 16)+ Pt.y);
postmessage(Wnd,WM_LBUTTONUP,0,(Pt.x shl 16)+ Pt.y);

end;
Меня смущает TPageContol - там вкладки две. Как на нужную вывести?
Nub вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатия CTRL-V в чужом окне ]Wowan[ Общие вопросы Delphi 0 25.04.2009 18:42
Эмуляция набора фразы на клавиатуре в независимом окне Uncertainty Win Api 7 11.02.2009 11:33
Эмуляция клика мыши Stimer Win Api 1 05.02.2009 04:06
Эмуляция мыши Travolta Общие вопросы .NET 0 07.11.2008 14:43
Эмуляция работы мыши R@mec Общие вопросы C/C++ 2 23.08.2008 14:50