PDA

Показать полную графическую версию : [решено] Использование User32.dll вместо MouseClick


HORRIBLE
28-03-2010, 20:12
Интересует такая штучка: к примеру имею вот такой код:

#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 тут вот: ссылка (http://forum.oszone.net/post-986154-1325.html) но как это все под свою задачу оформить......
Одним словом, что спрашивается как клацнуть по картинке, как во втором способе но не используя мышку?

Спасибо.

Creat0R
28-03-2010, 22:52
А ControlClick не подходит?

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

#include <SendMessage.au3>
#include <WindowsConstants.au3>

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

HORRIBLE
28-03-2010, 23:09
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), а как сюда привязать координаты картинки ?

Creat0R
28-03-2010, 23:13
через ControlClick вы вот так имеете в виду ? »
Примерно да, но почему бы ещё не указать заголовок IE?

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

Creat0R
28-03-2010, 23:52
Вот так работает:

#include <IE.au3>

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

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $oImg In (http://www.autoitscript.com/autoit3/docs/keywords.htm#In) $oImgs
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $oImg.Alt == "Download AutoIt" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iScreenX = _IEPropertyGet($oImg, "browserx")
$iScreenY = _IEPropertyGet($oImg, "browsery")

ControlClick (http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm)("[CLASS:IEFrame]", "", "Internet Explorer_Server1", "Main", 1, $iScreenX, $iScreenY)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

HORRIBLE
29-03-2010, 00:06
Спасибо.

HORRIBLE
29-03-2010, 19:51
Creat0R, а как применить ControlClick если я имею только вот эти координаты:

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

crashtuak
29-03-2010, 22:19
Хм, мне интерестно, каким образом можно применить SendMessage к картинке на страничке... Ведь SendMessage только для тех елементов, у которых хендл есть...

Creat0R
29-03-2010, 23:32
как применить 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")

....


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

HORRIBLE
30-03-2010, 01:18
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 кликает не туда.

Creat0R
30-03-2010, 09:21
почему то не туда кликает »
Я если честно не пойму, почему нужно использовать именно «screenx» а не «browserx»?

Мышь передвигается куда надо (просто чтоб посмотреть, где точка находится), а ControlClick кликает не туда »
Замени
WinGetHandle("[CLASS:IEFrame]")
на
ControlGetHandle("[CLASS:IEFrame]", "", "Internet Explorer_Server1")

только не нужно потом говорить что мышка не туда кликает :gigi: - у неё и элемента окна разные координаты, и разные методы распознавания (второе у мышки можно настроить).

HORRIBLE
30-03-2010, 12:02
только не нужно потом говорить что мышка не туда кликает - у неё и элемента окна разные координаты, и разные методы распознавания (второе у мышки можно настроить). »
Это я понял, настроил наводится куда нужно и кликает куда нужно. Спасибо.

Я если честно не пойму, почему нужно использовать именно «screenx» а не «browserx»? »
Потому что на одном сайте, при использовании этой команды _IEPropertyGet($oImg, "browserx") возвращается 0. А остальные координаты: «screenx» «screeny» «browsery» ширина, высота возвращаются как нужно. Вот поэтому и пошли такие "изголения".




© OSzone.net 2001-2012