12 posts in this topic
Full script w/details in comments below, just in case you need to run it to see the problem. Basically WinGetPos is incorrectly returning the W & H sizes, while at the same time correctly returning the positions. To compound the problem, I ran the same script on 2 different PCs and it gets2 different results as follows:
Win7 Pro PC.. GUICreate used to set W:300, H:100. WinGetPos returns W:307, H:127 (PC screen res: 1366x768)
WinXP PC..... GUICreate used to set W:300, H:100. WinGetPos returns W:308, H:134 (PC screen res: 1152x864)
The bigger problem occurs when you consider I want to save the Window sizes and recreate the window at a later date. but due to this problem, each time I ran the program the Window would get larger and larger. --pete
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> ; SCRIPT DESC.: Simple script here. Create & display one Window of a specific ; size & position. This Window is always ON TOP of other windows. ; User may resize the window to cover up unwanted content (as in use with a Web-Browser). ; Upon user closing the Window, DEBUG msgbox in script returns window size & position ; to be used in further development of this script. ; ; PROBLEM: If user does not resize the Window and simply clicks "X" to close the window, ; the DEBUG msgbox is reporting the wrong SIZES. It's actually the AutoIt WinGetPos ; function that is returning correct positions, but incorrectly returning the sizes. ; It should be returning 300 (W), 100 (H), but it's incorrectly returning 307 (W), 127 (H) ; _MAIN() Func _MAIN() ;Local $sFilePath = "..\GUI\logo4___.gif" Local $l_SizeWidth_1, $l_SizeHeight_1, $l_PosLeft_1, $l_PosTop_1 ; Defaults for Window 1 Size and Position $l_SizeWidth_1 = 300 $l_SizeHeight_1 = 100 $l_PosLeft_1 = 50 $l_PosTop_1 = 50 ; Create re-sizable GUI window/form that is blank with a black background and stays on TOP over over windows. Local $hGUI = GUICreate("COVER UNWANTED CONTENT", $l_SizeWidth_1, $l_SizeHeight_1, $l_PosLeft_1, $l_PosTop_1, _ $WS_OVERLAPPEDWINDOW, $WS_EX_TOPMOST) ; Black Background GUISetBkColor(0x000000) ;GUICtrlCreatePic("..\GUI\msoobe.jpg", 0, 0, 400, 100) ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) ; Create a picture control with a transparent image. ;GUICtrlCreatePic($sFilePath, 0, 0, 169, 68) ; Display the Window GUISetState(@SW_SHOW) ; Loop until the user exits. While 1 Switch GUIGetMsg() ; CASE IF USER X's out, CLOSE THE WINDOWS & QUIT Case $GUI_EVENT_CLOSE ExitLoop ; CASE Open a second window EndSwitch WEnd ; Obtain the window(s) Size & Positions _WindowPositionAndSize($hGUI) ; Save the window(s) size & positions ; TBD ; Delete the previous GUIs and all controls. GUIDelete($hGUI) EndFunc ;==>_MAIN Func _WindowPositionAndSize($WindowID) ; Retrieve the position as well as height and width of the window. Local $aPos = WinGetPos($WindowID) ; DEBUG msgbox ; Display the array values returned by WinGetPos. MsgBox(0, "", "X-Pos: " & $aPos & @CRLF & _ "Y-Pos: " & $aPos & @CRLF & _ "Width: " & $aPos & @CRLF & _ "Height: " & $aPos ) ; DEBUG notes ; Width 300 off by a factor of.. 0.9740261 ; Height 100 off by a factor of.. 0.7874017 ; I was hoping to add in some correction factors, but thse factors ; change dramatically at different Width & Height settings. Need a better fix! EndFunc ;==>_WindowPositioAndSize
I left a comment in another thread on multitouch, but my question can be missed there and the solution might have no relationship with simulating multi-touch.
So, is there any possibility to get the multiple x,y coordinates on a multi-touch device?
Smth like mousegetpos, but multiple (?)
Thank you for any idea / direction towards a solution.
Func workSpaceSetup () ConsoleWrite ("workSpaceSetup" &@CRLF) $workSpace = WinGetHandle ("some site - Google Chrome") ConsoleWrite ($workSpace&@CRLF) $pos1 = WinGetPos ($workSpace) WinMove ($workSpace , "", $pos1 , $pos1 , 1366, 768, 0) EndFunc So the script is first, the error I get is second in the quote.
This is one function of many for an app I am building but it is the first one that runs so I know there aren't other things at play here.
The idea is to keep the window in the same space it is when the script runs but just resize it as this app is used across multiple computers with different screen resolutions.
Could someone please elaborate upon what "Subscript used on non-accessible variable" means?
Oh and the variable is declared as "Global $pos1 = 0" at the top outside of any functions with the other global variables.
Any advice would be greatly appreciated!
I've encountered a small issue i just cant seem to program my way out of...
What im doing is: ;or rather, what im trying to do is
Pixelsearch for a color, within a part of my screen,
If color is present, i will rightclick it, for a menu to appear,
in which i want to Leftclick an option. Simplicity itself.
The issue is that because this menu appears in different parts of my screen, its complicated to select the option i want to click.
There is no special color to it, and i cannot define the area in which to click, because the menu appears different places.
The only thing that is in common for the menu is that the Leftclick needs to be (lets say) 30pixels below the rightclick
What can be done, but seemingly not by me, is to get the coordinates of the rightclick, and use them as the "starting point" from where the coordinates for the leftclick will be.
(Not sure if that makes sence, but maybe the code below will help you understand)
You guys like example codes, so therefore i will give it my best shot, and hope it proves usefull
$pos = Pixelsearch(200, 400, 200, 400, 0xFFFFFF) ;This color is what i need to rightclick to bring up the menu
If not @Error then ;If the color is present
(Mouseclick("Right", $pos, $pos, 1, 1) ;Rightclick it, to bring up menu
;Here comes the part i cannot get to work
$x = MousegetPos(X) ;To get the Coordinate "X", so we can calculated with it for the position of the leftclick
$y = MousegetPos(Y) ; To get the Coordinate "Y", so that can be calculated with for the position of the leftclick
MouseClick("Left", $x, $y-30, 1, 1) ;This was supposed to give me a leftclick that is 30pixels below the rightclick.
(The MouseGetPos(X), may seem as a waste of space in this example, but in my script i will need both.
Im only using one in the example, mainly so that i wont confuse myself, but also to make it easier to digest for you guys)
I have not been able to find any topic that covers this, but my apologies if such a topic already exist in the forums.
Maybe while im at it, can i ask, what good does the  and  do, when using a "$variable" as coordinate?
Thanks in advance
I am trying to do something, but it appears that I am having issues with trying to get the right functions called, in the right order.
What I want to do is move a window to a certain position and then move it back, but as stated, the order appears to be an issue, as if the window is minimized, the wingetclientsize is not able to pull the info, not is the wingetpos. It appears to be able to get the size and position of the window in question is activated, but I have to activate it first, but that defeats the purpose, as once activated, the functions called to get the position and size, are not correct, as the screen is now active. I have tried to use wingetstate, to get the state first, but I am not sure how to move the window back to the original location with the right state.
If window is minimized, I want it to go back to minimized state, as well as keeping the window size the same, so if the user activates the window, the user does not have to resize it.
If the window is active and is on another screen, it appears I do not have the same issue.
Here is my attempt, but I have tried other combinations. Has anyone got an idea on how to resolve this issue?
Func MoveVNC($Move) CreateLogEntry("Called MoveVNC($Move) $Move = " & $Move) Local $aStartBar = StartBar() Local $bMove = False Local $VNC = 'NAMEOFWINDOW' Static $aWin_VNC_Pos = '' Static $iWin_VNC_State = '' Static $aWin_VNC_Size = '' #cs ;$aWin_VNC_Pos = WinGetPos($VNC, '') MsgBox('','VNC POS','') _ArrayDisplay(WinGetPos($VNC, '')) MsgBox('','VNC STATE',WinGetState($VNC, '')) WinActivate($VNC) Sleep(20) WinWaitActive($VNC, '', 10) Sleep(20) Local $aSize = WinGetClientSize($VNC, '') MsgBox('','VNC SIZE','') _ArrayDisplay($aSize) #ce If $Move = 'Get' Then Opt("WinTitleMatchMode", -1) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase If WinExists($VNC) Then WinActivate($VNC) Sleep(20) WinWaitActive($VNC, '', 10) Sleep(20) $aWin_VNC_Pos = WinGetPos($VNC, '') Sleep(20) ;_ArrayDisplay($aWin_VNC_Pos, '$aWin_VNC_Pos') $iWin_VNC_State = WinGetState($VNC, '') Sleep(20) $aWin_VNC_Size = WinGetClientSize($VNC, '') ;_ArrayDisplay($aWin_VNC_Size) ;MsgBox('','$VNC',$VNC) ;MsgBox('', '$iWin_VNC_State', $iWin_VNC_State) ;WinSetState($VNC, '', @SW_MAXIMIZE) ;Sleep(20) WinMove($VNC, '', 0, 0, 1600, 950) ; - (3 * $aStartBar) Sleep(20) ;MouseClick('Left', 1764, 174) $bMove = True Else MsgBox($MB_TOPMOST, 'ERROR GET', 'Window ' & $VNC & ' Does not exists - VNC is not running!') EndIf If Not $bMove Then CreateLogEntry("MoveVNC(GET) FAILED") Return False Else CreateLogEntry("MoveVNC(GET) PASSED") Return True EndIf ElseIf $Move = 'Put' Then CreateLogEntry("Called MoveVNC($Move) $Move = " & $Move) If WinExists($VNC) Then ;WinSetState($VNC, '', @SW_RESTORE) ;If @error Then MsgBox('', '', @error) ;Sleep(20) WinMove($VNC, '', $aWin_VNC_Pos, $aWin_VNC_Pos, $aWin_VNC_Pos, $aWin_VNC_Pos) If @error Then MsgBox('', '', @error) Sleep(20) ;WinSetState($VNC, '', $iWin_VNC_State) ;If @error Then MsgBox('', 'Not setting state', @error & ' ' & $VNC) ;Sleep(20) $bMove = True Else MsgBox($MB_TOPMOST, 'ERROR PUT', 'Window ' & $VNC & ' Does not exists - VNC is not running!') EndIf If Not $bMove Then CreateLogEntry("MoveVNC(PUT) FAILED") Return False Else CreateLogEntry("MoveVNC(PUT) PASSED") Return True EndIf EndIf CreateLogEntry(" Returned from MoveVNC()") EndFunc ;==>MoveVNC