Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Использование User32.dll вместо MouseClick (http://forum.oszone.net/showthread.php?t=171526)

HORRIBLE 28-03-2010 20:12 1379283

Использование User32.dll вместо MouseClick
 
Интересует такая штучка: к примеру имею вот такой код:
Код:

#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 тут вот: ссылка но как это все под свою задачу оформить......
Одним словом, что спрашивается как клацнуть по картинке, как во втором способе но не используя мышку?

Спасибо.

Creat0R 28-03-2010 22:52 1379389

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

Цитата:

Цитата HORRIBLE
наткнулся на сообщение от Creat0R тут вот »

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

Код:

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

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


HORRIBLE 28-03-2010 23:09 1379396

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 1379401

Цитата:

Цитата HORRIBLE
через ControlClick вы вот так имеете в виду ? »

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

Цитата:

Цитата HORRIBLE
как сюда привязать координаты ? »

Вместо 0-лей попробовать? хотя по сути ControlClick это тоже самое.

Creat0R 28-03-2010 23:52 1379420

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

Код:

#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


HORRIBLE 29-03-2010 00:06 1379426

Спасибо.

HORRIBLE 29-03-2010 19:51 1380088

Creat0R, а как применить ControlClick если я имею только вот эти координаты:
Код:

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


crashtuak 29-03-2010 22:19 1380188

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

Creat0R 29-03-2010 23:32 1380246

Цитата:

Цитата 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), а не самой картинке.

HORRIBLE 30-03-2010 01:18 1380326

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 1380435

Цитата:

Цитата HORRIBLE
почему то не туда кликает »

Я если честно не пойму, почему нужно использовать именно «screenx» а не «browserx»?

Цитата:

Цитата HORRIBLE
Мышь передвигается куда надо (просто чтоб посмотреть, где точка находится), а ControlClick кликает не туда »

Замени
Код:

WinGetHandle("[CLASS:IEFrame]")
на
Код:

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

HORRIBLE 30-03-2010 12:02 1380540

Цитата:

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

Это я понял, настроил наводится куда нужно и кликает куда нужно. Спасибо.

Цитата:

Цитата Creat0R
Я если честно не пойму, почему нужно использовать именно «screenx» а не «browserx»? »

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


Время: 03:07.

Время: 03:07.
© OSzone.net 2001-