Что нового

PixelSearch и клик мыши за границами экрана. возможно?

agikon

Знающий
Сообщения
789
Репутация
17
Хочу организовть некую автоматику независимо от того окно на видимой области рабочего стола или за его видимой областью. ну то есть беру окно и тяну на край раб стола так чтобы только кусочек его видно было на раб столе, а остальное за экраном.
то есть чтобы например PixelSearch искал по координатам
Код:
$search = PixelSearch(-1000, -1000, 2000, 2000 , 0xfffff, 0, 1)

(разрешение у меня 1280х1024)

и если найдёт нужный клик кликнет мышей.
так вот что-то PixelSearch не ищет за границами видимой части раб стола.
да и пробовал явно мышкой кликнуть за пределы экрана тоже не хочет.

что-то я упускаю или PixelSearch и кликнуть за границами экрана не могут ни искать пиксель. ни кликнуть мышкой?
подскажите пожалуйста.
 

Arei

Скриптер
Сообщения
938
Репутация
115
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 324, 174, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 9, 8, 295, 97)
Opt("PixelCoordMode",2)

HotKeySet("{F5}", "TogglePause")



GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit


	EndSwitch
WEnd



Func TogglePause()

		$var = PixelGetColor( 44 , 40 )

MsgBox(0,"цвет", "0х"&Hex($var, 6))
EndFunc


Потом измените координаты окна и нажмите F5 /Для повторной проверки.
Это,если в вашем же окне.Другие способы можно позже рассмотреть.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Arei
Ваш пример к сожалению совсем не работает.

1)если окно поместить за экран то постоянно выдаёт цвет ffffff (то есть за экраном всё-равно не видит цвета)

2)я бы хотел чтобы сканировало не внутри окна, а область по заданым координатам за видимой обблюстью экрана.

такое возможно?
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
ну хорошо, пускай уже и с Opt("PixelCoordMode",2) в активном окне относительно ищет.

но так не работает же и так, вот пример, если окно на раб столе и нажать F5 то показывает D4D0C8, а если переместить окно за границы видимой области раб стола то показывает постоянно FFFFFF

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 324, 174, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 9, 8, 295, 97)
Opt("PixelCoordMode",2)
HotKeySet("{F5}", "TogglePause")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func TogglePause()
        $var = PixelGetColor( 0 , 0 )
MsgBox(0,"цвет", "0х"&Hex($var, 6))
EndFunc


подскажите пожалуйста что не так?
 

ballarad

Новичок
Сообщения
2
Репутация
2
Считать цвет за границами можно так:
Код:
#include <WinAPIEx.au3>
#include <WinAPI.au3>

Func _PixelGetColorEx ($iX, $iY, $hWnd)
    Local $hDDC, $hCDC, $hBMP
    $iWidth = _WinAPI_GetWindowWidth($hWnd)
    $iHeight = _WinAPI_GetWindowHeight($hWnd)
    $hDDC = _WinAPI_GetDC($hWnd)
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) ; создаем битовый массив
    _WinAPI_SelectObject($hCDC, $hBMP)
    DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
    $sColor = _WinAPI_GetPixel($hCDC, $iX, $iY)
    _WinAPI_ReleaseDC($hWnd, $hDDC)
    _WinAPI_DeleteDC($hCDC)
   _WinAPI_DeleteObject($hBMP) ; очищаем битовый массив
    Return $sColor
EndFunc   ;==>_PixelGetColorEx


А исакть цвет так :
Код:
Func _SearchPix($x1, $y1, $x2, $y2, $coll, $shvar=0, $step=1)
$hWnd = WinWait('', '', 3)
$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
    $ARGB = _WinAPI_IntToDWord(BitOR($coll, 0xFF000000))
    $Size = WinGetClientSize($hWnd)
    $L = $Size[0] * $Size[1]
    $tBits = DllStructCreate('dword[' & $L & ']')
    _WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
    $Offset = -1
    For $i = $L1 To $L2 Step $step
        If DllStructGetData($tBits, 1, $i) = $ARGB Then
            $Offset = $i
            ExitLoop
        EndIf
    Next
    If $Offset = -1 Then
        Return SetError(1)
    Else
        $x = Mod($Offset, $Size[0]) - 1
        $y = Ceiling($Offset / $Size[0]) - 1
        Local $coor[2] = [$x+8, $y+30]
        Return $coor
    EndIf
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
спасибо.
я так понял за границей экрана можно искать только в окне. ну хорошо что хоть так.

но а как кликнуть мышкой за границами экрана в каком-то окне?



Добавлено:
Сообщение автоматически объединено:

да что-то и этот код не ищет...
эх видать не судьба.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
даже не компилируется..

Код:
#include <WinAPIEx.au3>
#include <WinAPI.au3>

#include <Misc.au3>
#include <GUIConstantsEx.au3>

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

Opt("PixelCoordMode",2)
Opt("MouseCoordMode", 2)

Global $shvar=0, $step=1, $L1, $L2
$coll = 0x1ab7f2

$GUI = GUICreate('color', 400, 300)

GUISetState()
HotKeySet("{F5}", "_SearchPix")

While 1
 	$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func _SearchPix(1285, 0, 1400, 20, $coll, $shvar=0, $step=1)
$hWnd = WinWait('[REGEXPTITLE:.*Skype.*]', '', 3)
$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
    $ARGB = _WinAPI_IntToDWord(BitOR($coll, 0x1ab7f2))
    $Size = WinGetClientSize($hWnd)
    $L = $Size[0] * $Size[1]
    $tBits = DllStructCreate('dword[' & $L & ']')
    _WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
    $Offset = -1
    For $i = $L1 To $L2 Step $step
        If DllStructGetData($tBits, 1, $i) = $ARGB Then
            $Offset = $i
            ExitLoop
        EndIf
    Next
    If $Offset = -1 Then
        Return SetError(1)
    Else
        $x = Mod($Offset, $Size[0]) - 1
        $y = Ceiling($Offset / $Size[0]) - 1
        Local $coor[2] = [$x+8, $y+30]
        Return $coor
    EndIf
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
ballarad
да это всё не то!
ни какой мне концепции не надо!
всё в развернутом окне должно искать, но просто за границами экрана.
и всего то обнаружить координату пикселя и кликнуть по нему.
 
Верх