Malkey Posted August 20, 2011 Posted August 20, 2011 Try this. #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <SendMessage.au3> Global Const $SC_DRAGMOVE = 0xF012 Global $ver = "Program Launcher 2.7" Global $iW = 128 Global $iH = 170 Global $mainpos Global $hGUI = GUICreate($ver, $iW, $iH, @DesktopWidth - $iW, (@DesktopHeight - $iH) / 2, BitOR($WS_SYSMENU, $WS_POPUP, $WS_BORDER), $WS_EX_TOOLWINDOW) Global $ListView = GUICtrlCreateListView("col1|col2", 0, 30, $iW + 40, $iH - 40) GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg();check the gui for messages Case $GUI_EVENT_CLOSE ; Esc to exit Exit Case $GUI_EVENT_PRIMARYDOWN;if left mouse is clicked _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0);move the gui $mainpos = WinGetPos($ver) WinMove($ver, "", _RoundEx($mainpos[0], 75), _RoundEx($mainpos[1], 75)) EndSwitch WEnd ; Round up or down to nearest $x value eg. 4.185 to nearest 0.01 rounds up to 4.19 Func _RoundEx($n, $x = 1) If Round(Mod($n, $x), 8) < ($x / 2) Then Return Int($n / $x) * $x Else Return Ceiling($n / $x) * $x EndIf EndFunc ;==>_RoundEx
kaotkbliss Posted August 20, 2011 Author Posted August 20, 2011 I've been playing around with all these suggestion (just wanted to let you all know) to see if I could get something to work. So far not yet, but lots of interesting ideas. 010101000110100001101001011100110010000001101001011100110010000 001101101011110010010000001110011011010010110011100100001 My Android cat and mouse gamehttps://play.google.com/store/apps/details?id=com.KaosVisions.WhiskersNSqueek We're gonna need another Timmy!
kaotkbliss Posted November 1, 2011 Author Posted November 1, 2011 revisiting this thread as I think I've gotten somewhere, maybe save this file as C:\Allin1move.au3 expandcollapse popup#include <Misc.au3> #include <WinAPI.au3> Opt("TrayIconHide", 1) $activetitle = WinGetTitle("[active]") $activewin = WinActive($activetitle) $size = WinGetPos($activewin) $winH = $size[3] $winW = $size[2] Global $__MonitorList[1][5] $__MonitorList[0][0] = 0 Global $curres[2] Global $resmatch = 1 Global $index = 0 ;end setting variables $mainmon = _GetMonitorFromPoint() If $mainmon = 0 Then $mainmon = 1 $res1 = _GetMonitors() $resx = $res1[$mainmon][3] $resy = $res1[$mainmon][4] $curres[0] = $resx $curres[1] = $resy $xgrid = $resx / $winW $ygrid = ($resy - _GetTaskbarHeight()) / $winH $xgridx = 0 $ygridy = 0 While _IsPressed(01) $size = WinGetPos($activewin) $mouse = MouseGetPos() $mainmon = _GetMonitorFromPoint($mouse[0], $mouse[1]) If $mainmon = 0 Then $mainmon = 1 $res1 = _GetMonitors() $resx = $res1[$mainmon][3] $resy = $res1[$mainmon][4] If (($curres[0] <> $resx And $curres[1] <> $resy) Or ($curres[0] = $resx And $curres[1] = $resy)) And $resmatch = 1 Then If $curres[0] <> $resx And $curres[1] <> $resy Then $resmatch = 0 $xgrid = $resx / $winW $ygrid = ($resy - _GetTaskbarHeight()) / $winH ElseIf $curres[0] = $resx And $curres[1] = $resy And $resmatch = 0 Then $resmatch = 1 EndIf For $gridx = 0 to $xgrid If $size[0] >= ($gridx * $winW - 30) And $size[0] <= ($gridx * $winW + 30) Then $xgridx = $gridx ExitLoop EndIf Next For $gridy = 0 to $ygrid If $size[1] >= ($gridy * $winH - 30) And $size[1] <= ($gridy * $winH + 30) Then $ygridy = $gridy ExitLoop EndIf Next If $xgridx <> $gridx Or $ygridy <> $gridy Then ; Else WinMove($activewin,"",$xgridx * $winW,$ygridy * $winH) EndIf WEnd ;Thank you wakillon for this Func _GetTaskbarHeight() Local Const $SPI_GETWORKAREA = 48 Local $WorkArea, $stRect = DllStructCreate("long left;long top;long right;long bottom") Local $iResult = _WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($stRect), 0) If $iResult = True Then $WorkArea = DllStructGetData($stRect, "bottom") - DllStructGetData($stRect, "top") If Not @error Then Return @DesktopHeight - $WorkArea EndIf EndFunc ;==>_GetTaskbarHeight #Region thanks to xrxca for these functions Func _GetMonitorFromPoint($XorPoint = 0, $y = 0) Local $MousePos, $myX, $myY If @NumParams = 0 Then $MousePos = MouseGetPos() $myX = $MousePos[0] $myY = $MousePos[1] ElseIf (@NumParams = 1) And IsArray($XorPoint) Then $myX = $XorPoint[0] $myY = $XorPoint[1] Else $myX = $XorPoint $myY = $y EndIf If $__MonitorList[0][0] == 0 Then _GetMonitors() EndIf Local $i = 0 Local $Monitor = 0 For $i = 1 To $__MonitorList[0][0] If ($myX >= $__MonitorList[$i][1]) _ And ($myX < $__MonitorList[$i][3]) _ And ($myY >= $__MonitorList[$i][2]) _ And ($myY < $__MonitorList[$i][4]) Then $Monitor = $i Next Return $Monitor EndFunc ;==>_GetMonitorFromPoint Func _GetMonitors() $__MonitorList[0][0] = 0 ; Added so that the global array is reset if this is called multiple times Local $handle = DllCallbackRegister("_MonitorEnumProc", "int", "hwnd;hwnd;ptr;lparam") DllCall("user32.dll", "int", "EnumDisplayMonitors", "hwnd", 0, "ptr", 0, "ptr", DllCallbackGetPtr($handle), "lparam", 0) DllCallbackFree($handle) Local $i = 0 For $i = 1 To $__MonitorList[0][0] If $__MonitorList[$i][1] < $__MonitorList[0][1] Then $__MonitorList[0][1] = $__MonitorList[$i][1] If $__MonitorList[$i][2] < $__MonitorList[0][2] Then $__MonitorList[0][2] = $__MonitorList[$i][2] If $__MonitorList[$i][3] > $__MonitorList[0][3] Then $__MonitorList[0][3] = $__MonitorList[$i][3] If $__MonitorList[$i][4] > $__MonitorList[0][4] Then $__MonitorList[0][4] = $__MonitorList[$i][4] Next Return $__MonitorList EndFunc ;==>_GetMonitors Func _MonitorEnumProc($hMonitor, $hDC, $lRect, $lParam) Local $Rect = DllStructCreate("int left;int top;int right;int bottom", $lRect) $__MonitorList[0][0] += 1 ReDim $__MonitorList[$__MonitorList[0][0] + 1][5] If $hDC = $hDC Then EndIf If $lParam = $lParam Then EndIf $__MonitorList[$__MonitorList[0][0]][0] = $hMonitor $__MonitorList[$__MonitorList[0][0]][1] = DllStructGetData($Rect, "left") $__MonitorList[$__MonitorList[0][0]][2] = DllStructGetData($Rect, "top") $__MonitorList[$__MonitorList[0][0]][3] = DllStructGetData($Rect, "right") $__MonitorList[$__MonitorList[0][0]][4] = DllStructGetData($Rect, "bottom") Return 1 ; Return 1 to continue enumeration EndFunc ;==>_MonitorEnumProc #EndRegion thanks to xrxca for these functions Run this program and when you click and drag, it will run the above code expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <Misc.au3> #include <SendMessage.au3> HotKeySet("{ESC}", "Terminate") Global $ver = "Program Launcher 2.7" $iW = 128 $iH = 170 $t = TimerInit();starts the timer in 't' $q = 0 Global $__MonitorList[1][5] $__MonitorList[0][0] = 0 Global $curres[2] Global $resmatch = 1 Global Const $SC_DRAGMOVE = 0xF012 ;end setting variables $mainmon = _GetMonitorFromPoint() If $mainmon = 0 Then $mainmon = 1 $res1 = _GetMonitors() $resx = $res1[$mainmon][3] $resy = $res1[$mainmon][4] $curres[0] = $resx $curres[1] = $resy $hGUI = GUICreate($ver, $iW, $iH, @DesktopWidth - $iW, (@DesktopHeight - $iH) / 2, BitOR($WS_SYSMENU, $WS_POPUP, $WS_BORDER), $WS_EX_TOOLWINDOW) $ListView = GUICtrlCreateListView("col1|col2", 0, 30, $iW + 40, $iH - 40) GUISetState(@SW_SHOW) While 1;start infinate loop Sleep(10);pause for 10 milliseconds $mainpos = WinGetPos($ver) $mainmon = _GetMonitorFromPoint($mainpos, $mainpos[1]) If $mainmon = 0 Then $mainmon = 1 $res1 = _GetMonitors() $resx = $res1[$mainmon][3] $resy = $res1[$mainmon][4] If $mainpos[0]+$mainpos[2] > $resx Then WinMove($ver,"",$resx-$mainpos[2],$mainpos[1]) EndIf If $mainpos[0] < 0 Then WinMove($ver,"",0,$mainpos[1]) EndIf If $mainpos[1]+$mainpos[3] > $resy - _GetTaskbarHeight() Then WinMove($ver,"",$mainpos[0],$resy-$mainpos[3] - _GetTaskbarHeight()) EndIf If $mainpos[1] < 0 Then WinMove($ver,"",$mainpos[0],0) EndIf Switch GUIGetMsg();check the gui for messages Case $GUI_EVENT_PRIMARYDOWN;if left mouse is clicked $xgrid = $resx / $mainpos[2] $ygrid = ($resy - _GetTaskbarHeight()) / $mainpos[3] $wincol = WinList() $extrax = 2 $extray = 2 $wpos = WinGetPos($ver);get the position of the main gui $mpos = MouseGetPos();get the mouse position $ipos = ControlGetPos($ver, "", $ListView);get the list area If $mpos[0] > $wpos[0] + $ipos[0] + $extrax And $mpos[1] > $wpos[1] + $ipos[1] + $extray And $mpos[0] < $wpos[0] + $ipos[0] + $extrax + $ipos[2] And $mpos[1] < $wpos[1] + $ipos[1] + $extray + $ipos[3] Then If TimerDiff($t) <= 500 And $q = 1 Then;if left click is in the list area MsgBox(0, "", "Double Clicked", 2) Else $t = TimerInit();reset the timer $q = 1 EndIf ElseIf $mpos[0] > $wpos[0] + $extrax And $mpos[1] > $wpos[1] + $extray And $mpos[0] < $wpos[0] + $ipos[0] + $extrax + $ipos[2] And $mpos[1] < $wpos[1] + $ipos[1] + $extray + $ipos[3] Then ;if the click is not in the list but in the main gui While _IsPressed("01");while the left button is held ShellExecute("C:\Allin1move.au3") _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0);move the gui WEnd EndIf EndSwitch WEnd Func _GetTaskbarHeight() Local Const $SPI_GETWORKAREA = 48 Local $WorkArea, $stRect = DllStructCreate("long left;long top;long right;long bottom") Local $iResult = _WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($stRect), 0) If $iResult = True Then $WorkArea = DllStructGetData($stRect, "bottom") - DllStructGetData($stRect, "top") If Not @error Then Return @DesktopHeight - $WorkArea EndIf EndFunc ;==>_GetTaskbarHeight #Region thanks to xrxca for these functions Func _GetMonitorFromPoint($XorPoint = 0, $y = 0) Local $MousePos, $myX, $myY If @NumParams = 0 Then $MousePos = MouseGetPos() $myX = $MousePos[0] $myY = $MousePos[1] ElseIf (@NumParams = 1) And IsArray($XorPoint) Then $myX = $XorPoint[0] $myY = $XorPoint[1] Else $myX = $XorPoint $myY = $y EndIf If $__MonitorList[0][0] == 0 Then _GetMonitors() EndIf Local $i = 0 Local $Monitor = 0 For $i = 1 To $__MonitorList[0][0] If ($myX >= $__MonitorList[$i][1]) _ And ($myX < $__MonitorList[$i][3]) _ And ($myY >= $__MonitorList[$i][2]) _ And ($myY < $__MonitorList[$i][4]) Then $Monitor = $i Next Return $Monitor EndFunc ;==>_GetMonitorFromPoint Func _GetMonitors() $__MonitorList[0][0] = 0 ; Added so that the global array is reset if this is called multiple times Local $handle = DllCallbackRegister("_MonitorEnumProc", "int", "hwnd;hwnd;ptr;lparam") DllCall("user32.dll", "int", "EnumDisplayMonitors", "hwnd", 0, "ptr", 0, "ptr", DllCallbackGetPtr($handle), "lparam", 0) DllCallbackFree($handle) Local $i = 0 For $i = 1 To $__MonitorList[0][0] If $__MonitorList[$i][1] < $__MonitorList[0][1] Then $__MonitorList[0][1] = $__MonitorList[$i][1] If $__MonitorList[$i][2] < $__MonitorList[0][2] Then $__MonitorList[0][2] = $__MonitorList[$i][2] If $__MonitorList[$i][3] > $__MonitorList[0][3] Then $__MonitorList[0][3] = $__MonitorList[$i][3] If $__MonitorList[$i][4] > $__MonitorList[0][4] Then $__MonitorList[0][4] = $__MonitorList[$i][4] Next Return $__MonitorList EndFunc ;==>_GetMonitors Func _MonitorEnumProc($hMonitor, $hDC, $lRect, $lParam) Local $Rect = DllStructCreate("int left;int top;int right;int bottom", $lRect) $__MonitorList[0][0] += 1 ReDim $__MonitorList[$__MonitorList[0][0] + 1][5] If $hDC = $hDC Then EndIf If $lParam = $lParam Then EndIf $__MonitorList[$__MonitorList[0][0]][0] = $hMonitor $__MonitorList[$__MonitorList[0][0]][1] = DllStructGetData($Rect, "left") $__MonitorList[$__MonitorList[0][0]][2] = DllStructGetData($Rect, "top") $__MonitorList[$__MonitorList[0][0]][3] = DllStructGetData($Rect, "right") $__MonitorList[$__MonitorList[0][0]][4] = DllStructGetData($Rect, "bottom") Return 1 ; Return 1 to continue enumeration EndFunc ;==>_MonitorEnumProc #EndRegion thanks to xrxca for these functions Func Terminate() Exit 0 EndFunc ;==>Terminate basically it's mostly working (I realized I would probably need a second script to monitor the window position since _sendmessage is a blocking function) I would just like to see if there is a way I can clean up to top script to keep the gui from flickering when it gets close to a "grid-line" 010101000110100001101001011100110010000001101001011100110010000 001101101011110010010000001110011011010010110011100100001 My Android cat and mouse gamehttps://play.google.com/store/apps/details?id=com.KaosVisions.WhiskersNSqueek We're gonna need another Timmy!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now