Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Использование User32.dll вместо MouseClick

Ответить
Настройки темы
[решено] Использование User32.dll вместо MouseClick

Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


Интересует такая штучка: к примеру имею вот такой код:
Код: Выделить весь код
#include <IE.au3>
$oIE = _IECreate ("www.autoitscript.com")
;1способ
;_IEImgClick ($oIE, "Download AutoIt", "alt")
;2-й способ
$oImgs = _IEImgGetCollection ($oIE)
For $oImg In $oImgs
   if  $oImg.alt == "Download AutoIt" Then
		$iScreenX = _IEPropertyGet($oImg, "screenx")
		$iScreenY = _IEPropertyGet($oImg, "screeny")
		MouseClick('LEFT', $iScreenX + $oImg.width,$iScreenY + $oImg.height)
   EndIf
Next
2-мя способами нажимаем на картинку, а возможно ли выполнить второй способ, без использования 1-го способа, с применением USER32.dll не используя мышь? (Откуда такой вопрос возник, есть такая программа, AUTOPILOT, там клики происходят без использования мыши, минус единственный приложение куда должно происходить нажатие должно быть на экране не скрыто.)
Наткнулся как делают: на примере кнопки START
Код: Выделить весь код
const Int32 WM_LBUTTONDOWN = 0x0201;
[DllImport("User32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
private static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);

IntPtr hTaskBar = FindWindow("Shell_TrayWnd", null); // ищем таскбар
if(hTaskBar != IntPtr.Zero)
{
    // находим кнопку Start
    IntPtr hStartBtn = FindWindowEx(hTaskBar,IntPtr.Zero,"Button", null);
    // кликаем ее
    if(hStartBtn != IntPtr.Zero) SendMessage(hStartBtn, WM_LBUTTONDOWN, 0, 0);
}
Потом по поиску "WM_LBUTTONDOWN" наткнулся на сообщение от Creat0R тут вот: ссылка но как это все под свою задачу оформить......
Одним словом, что спрашивается как клацнуть по картинке, как во втором способе но не используя мышку?

Спасибо.

Отправлено: 20:12, 28-03-2010

 

Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


А ControlClick не подходит?

Цитата HORRIBLE:
наткнулся на сообщение от Creat0R тут вот »
Это не то, там отлов, а тут нужно просто послать сообщение:

Код: Выделить весь код
#include <SendMessage.au3>
#include <WindowsConstants.au3>

_SendMessage($hWnd, $WM_LBUTTONDOWN, 0, 0)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:52, 28-03-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


Creat0R,через ControlClick вы вот так имеете в виду ?
Код: Выделить весь код
#include <IE.au3>
$oIE = _IECreate ("www.autoitscript.com")
;1способ
;_IEImgClick ($oIE, "Download AutoIt", "alt")
;2-й способ
$oImgs = _IEImgGetCollection ($oIE)
For $oImg In $oImgs
   if  $oImg.alt == "Download AutoIt" Then
		$iScreenX = _IEPropertyGet($oImg, "screenx")
		$iScreenY = _IEPropertyGet($oImg, "screeny")
		;MouseClick('LEFT', $iScreenX + $oImg.width/2,$iScreenY + $oImg.height/2)
		ControlClick('',"","[CLASS:Internet Explorer_Server; INSTANCE:1]","left","", $iScreenX + $oImg.width/2, $iScreenY + $oImg.height/2)
   EndIf
Next
Если да, то не работает.
А _SendMessage($hWnd, $WM_LBUTTONDOWN, 0, 0), а как сюда привязать координаты картинки ?

Отправлено: 23:09, 28-03-2010 | #3


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Цитата HORRIBLE:
через ControlClick вы вот так имеете в виду ? »
Примерно да, но почему бы ещё не указать заголовок IE?

Цитата HORRIBLE:
как сюда привязать координаты ? »
Вместо 0-лей попробовать? хотя по сути ControlClick это тоже самое.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 23:13, 28-03-2010 | #4


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Вот так работает:

Код: Выделить весь код
#include <IE.au3>

$oIE = _IECreate("www.autoitscript.com")
$oImgs = _IEImgGetCollection($oIE)

For $oImg In $oImgs
   If $oImg.Alt == "Download AutoIt" Then
        $iScreenX = _IEPropertyGet($oImg, "browserx")
        $iScreenY = _IEPropertyGet($oImg, "browsery")

        ControlClick("[CLASS:IEFrame]", "", "Internet Explorer_Server1", "Main", 1, $iScreenX, $iScreenY)
   EndIf
Next

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:52, 28-03-2010 | #5


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


Спасибо.

Отправлено: 00:06, 29-03-2010 | #6


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


Creat0R, а как применить ControlClick если я имею только вот эти координаты:
Код: Выделить весь код
$iScreenX = _IEPropertyGet($oImg, "screenx")
$iScreenY = _IEPropertyGet($oImg, "screeny")

Отправлено: 19:51, 29-03-2010 | #7


Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


Хм, мне интерестно, каким образом можно применить SendMessage к картинке на страничке... Ведь SendMessage только для тех елементов, у которых хендл есть...

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Отправлено: 22:19, 29-03-2010 | #8


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3054
Благодарности: 1008

Профиль | Сайт | Отправить PM | Цитировать


Цитата HORRIBLE:
как применить ControlClick если я имею только вот эти координаты »
Это координаты элемента относительно всего экрана, нужно конвертировать в координаты клиентской части окна:

Код: Выделить весь код
#include <WinAPI.au3>

....

$iScreenX = _IEPropertyGet($oImg, "screenx")
$iScreenY = _IEPropertyGet($oImg, "screeny")

$hWnd = WinGetHandle("[CLASS:IEFrame]")
$tPoint = DllStructCreate("int X;int Y;")

DllStructSetData($tPoint, "X", $iScreenX)
DllStructSetData($tPoint, "Y", $iScreenY)

_WinAPI_ScreenToClient($hWnd, $tPoint)

$iScreenX = DllStructGetData($tPoint, "X")
$iScreenY = DllStructGetData($tPoint, "Y")

....
Цитата crashtuak:
каким образом можно применить SendMessage к картинке на страничке »
Таким что сообщение посылается элементу окна IE (Internet Explorer_Server), а не самой картинке.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:32, 29-03-2010 | #9


Пользователь


Сообщения: 143
Благодарности: 24

Профиль | Отправить PM | Цитировать


Creat0R, спасибо, но оно почему то не туда кликает:

Код: Выделить весь код
#include <IE.au3>
#include <WinAPI.au3>
Opt("MouseCoordMode", 2)
$oIE = _IECreate("www.autoitscript.com")
$oImgs = _IEImgGetCollection($oIE)

For $oImg In $oImgs
   If $oImg.Alt == "Download AutoIt" Then
	$iScreenX = _IEPropertyGet($oImg, "screenx")
	$iScreenY = _IEPropertyGet($oImg, "screeny")

	$hWnd = WinGetHandle("[CLASS:IEFrame]")
	$tPoint = DllStructCreate("int X;int Y;")

	DllStructSetData($tPoint, "X", $iScreenX)
	DllStructSetData($tPoint, "Y", $iScreenY)

	_WinAPI_ScreenToClient($hWnd, $tPoint)

	$iScreenX = DllStructGetData($tPoint, "X")
	$iScreenY = DllStructGetData($tPoint, "Y")
			
	MouseMove($iScreenX, $iScreenY)
			
	ControlClick("[CLASS:IEFrame]", "", "Internet Explorer_Server1", "Main", 1, $iScreenX, $iScreenY)
   EndIf
Next
Мышь передвигается куда надо (просто чтоб посмотреть, где точка находится), а ControlClick кликает не туда.

Отправлено: 01:18, 30-03-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Использование User32.dll вместо MouseClick

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Ошибка - [решено] Ошибка: системная библиотека user32.dll перемещена в памяти... ruddystepa Microsoft Windows 2000/XP 127 05-08-2017 21:58
Разное - Использование AppLocker с dll файлами vasili111 Microsoft Windows 7 3 13-09-2009 11:40
Разное - Использование команд из user.exe(dll) n9271217 Microsoft Windows 2000/XP 0 13-01-2009 14:58
Загрузка - после восстановления User32.dll появляется черный экран ymuhin Microsoft Windows 2000/XP 14 14-12-2008 19:56
Загрузка - user32.dll - Точка входа в процедуру Close Clip... kolchoz Microsoft Windows 2000/XP 7 10-08-2007 19:24




 
Переход