Jump to content

corz

Active Members
  • Posts

    254
  • Joined

  • Last visited

Everything posted by corz

  1. I don't need debugging help. I'm just curious if anyone knows of another reason (other than re-ordering the GUI) for this happening. If you must, you can see the code here.. https://corz.org/public/machine/source/beta/windows/ffe/ffe.au3
  2. I have an app (we don't need the source, and anyway it's many thousands of lines long). During init, it checks to see if another instance is running and if so, send the input file to its file input, something like.. ControlSetText($my_title, "", "[CLASS:Edit; INSTANCE:1]", $inputfile, 1) It's worked great for years. After building a new version, it now sends the string to a completely different input (which is a combobox, much further down the code). My original input (the first control in the GUI) is now "instance:2". There has been no change in the order of the controls. Question: What caused this change? I want to know if this is something that I did, and how to avoid it happening in the future!
  3. Niche is good. Though I wish I knew what you were trying to actually DO. Is it a secret? With _GUICtrlEdit_SetSel() The first point set is the anchor - it says so in your version of the script. The "natural" way to tell is to look how you coded it! Or read the info in the GUI. And with double-click, the left point is always the anchor (in L2R languages). I don't get it. But then, I have no idea what you actually need that the above example doesn't provide. ;o) Cor
  4. I'm using Chrome. I don't even have Firefox installed right now. Hadn't tried IE. Most peeps use Chrome nowadays so I'd like it to work there. ;o) Cor ps. I just tried it in Edge. It works! Uses the path to the cached image, though, rather than the URL.
  5. Associative Array Functions I've seen a couple of UDFs for this on the forum. One of them I quite like. But it's still nearly not as good as this method, IMHO. I don't recall if I discovered the "Scripting.Dictionary" COM object myself or if I got the original base code from somewhere online. I have recently searched the web (and here) hard for any AutoIt references to this, other than my own over the years I've been using this (in ffe, etc..), and I can find nothing, so I dunno. If anyone does, I'd love to give credit where it's due; this is some cute stuff! It could actually be all my own work! lol At any rate, it's too useful to not have posted somewhere at autoitscript.com, so I've put together a wee demo. For those who haven't heard of the COM "Scripting.Dictionary".. If you've ever coded in Perl or PHP (and many other languages), you know how useful associative arrays are. Basically, rather than having to iterate through an array to discover it's values, with an associative array you simply pluck values out by their key "names". I've added a few functions over the years, tweaked and tuned, and this now represent pretty much everything you need to easily work with associative arrays in AutoIt. En-joy! The main selling point of this approach is its simplicity and weight. I mean, look at how much code it takes to work with associative arrays! The demo is bigger than all the functions put together! The other selling point is that we are using Windows' built-in COM object functions which are at least theoretically, fast and robust. I've used it many times without issues, anyhow, here goes.. ; Associative arrays in AutoIt? Hells yeah! ; Initialize your array ... global $oMyError = ObjEvent("AutoIt.Error", "AAError") ; Initialize a COM error handler ; first example, simple. global $simple AAInit($simple) AAAdd($simple, "John", "Baptist") AAAdd($simple, "Mary", "Lady Of The Night") AAAdd($simple, "Trump", "Silly Man-Child") AAList($simple) debug("It is said that Trump is a " & AAGetItem($simple, "Trump") & ".", @ScriptLineNumber);debug debug("") ; slightly more interesting.. $ini_path = "AA_Test.ini" ; Put this prefs section in your ini file.. ; [test] ; foo=foo value ; foo2=foo2 value ; bar=bar value ; bar2=bar2 value global $associative_array AAInit($associative_array) ; We are going to convert this 2D array into a cute associative array where we ; can access the values by simply using their respective key names.. $test_array = IniReadSection($ini_path, "test") for $z = 1 to 2 ; do it twice, to show that the items are *really* there! for $i = 1 to $test_array[0][0] $key_name = $test_array[$i][0] debug("Adding '" & $key_name & "'..");debug ; key already exists in "$associative_array", use the pre-determined value.. if AAExists($associative_array, $key_name) then $this_value = AAGetItem($associative_array, $key_name) debug("key_name ALREADY EXISTS! : =>" & $key_name & "<=" , @ScriptLineNumber);debug else $this_value = $test_array[$i][1] ; store left=right value pair in AA if $this_value then AAAdd($associative_array, $key_name, $this_value) endif endif next next debug(@CRLF & "Array Count: =>" & AACount($associative_array) & "<=" , @ScriptLineNumber);debug AAList($associative_array) debug(@CRLF & "Removing 'foo'..");debug AARemove($associative_array, "foo") debug(@CRLF & "Array Count: =>" & AACount($associative_array) & "<=" , @ScriptLineNumber);debug AAList($associative_array) debug(@CRLF & "Removing 'bar'..");debug AARemove($associative_array, "bar") debug(@CRLF & "Array Count: =>" & AACount($associative_array) & "<=" , @ScriptLineNumber);debug AAList($associative_array) quit() func quit() AAWipe($associative_array) AAWipe($simple) endfunc ;; Begin AA Functions func AAInit(ByRef $dict_obj) $dict_obj = ObjCreate("Scripting.Dictionary") endfunc ; Adds a key and item pair to a Dictionary object.. func AAAdd(ByRef $dict_obj, $key, $val) $dict_obj.Add($key, $val) If @error Then return SetError(1, 1, -1) endfunc ; Removes a key and item pair from a Dictionary object.. func AARemove(ByRef $dict_obj, $key) $dict_obj.Remove($key) If @error Then return SetError(1, 1, -1) endfunc ; Returns true if a specified key exists in the associative array, false if not.. func AAExists(ByRef $dict_obj, $key) return $dict_obj.Exists($key) endfunc ; Returns a value for a specified key name in the associative array.. func AAGetItem(ByRef $dict_obj, $key) return $dict_obj.Item($key) endfunc ; Returns the total number of keys in the array.. func AACount(ByRef $dict_obj) return $dict_obj.Count endfunc ; List all the "Key" > "Item" pairs in the array.. func AAList(ByRef $dict_obj) debug("AAList: =>", @ScriptLineNumber);debug local $k = $dict_obj.Keys ; Get the keys ; local $a = $dict_obj.Items ; Get the items for $i = 0 to AACount($dict_obj) -1 ; Iterate the array debug($k[$i] & " ==> " & AAGetItem($dict_obj, $k[$i])) next endfunc ; Wipe the array, obviously. func AAWipe(ByRef $dict_obj) $dict_obj.RemoveAll() endfunc ; Oh oh! func AAError() Local $err = $oMyError.number If $err = 0 Then $err = -1 SetError($err) ; to check for after this function returns endfunc ;; End AA Functions. ; debug() (trimmed-down version) ; ; provides quick debug report in your console.. func debug($d_string, $ln=false) local $pre ; For Jump-to-Line in Notepad++ if $ln then $pre = "(" & $ln & ") " & @Tab ConsoleWrite($pre & $d_string & @CRLF) endfunc ;o) Cor
  6. Chimp, thanks! Trouble is, I already use WM_DROPFILES messages. I was accessing the DLL directly rather than using the WinAPI UDF (I hadn't noticed those functions) so I tried switching over to the UDF versions (much leaner code, thanks!) but it made no difference. I then tried fiddling with the GUICreate style attributes (looking at your example GUIs), but again with no effect. I ran the Kaleidoscope program (nice!) but on my system, dragging images from a web browser into it window won't work. Just like with my own app I get the "NO ENTRY" icon and nothing happens. Is this all supposed to work? Could there be something up with my system, perhaps? A security setting or something? ;o) Cor
  7. The example I posted tells you which end is the "Anchor". ;o) Cor
  8. I don't see what extra functionality your function involves. Why set a selection which is already set? _GUICtrlEdit_GetSel looks to me to have all you need. #include <GUIConstants.au3> #include <GUIEdit.au3> $hGUI = GUICreate('Test', 500, 320) $ed_Main = GUICtrlCreateEdit(FileRead(@ScriptFullPath), 0, 0, 500, 300) $lb_Status = GUICtrlCreateLabel('', 0, 300, 500, 20, BitOR($SS_SUNKEN, $SS_CENTERIMAGE)) GUISetState() Dim $aSelMem[2] _GUICtrlEdit_SetSel($ed_Main, 100, 10) While 1 $aSel = _GUICtrlEdit_GetSel($ed_Main) select case $aSel[0] <> $aSelMem[0] GUICtrlSetData($lb_Status, 'Selection anchor: ' & $aSel[1] & '. Selection active: ' & $aSel[0]) case $aSel[1] <> $aSelMem[1] GUICtrlSetData($lb_Status, 'Selection anchor: ' & $aSel[0] & '. Selection active: ' & $aSel[1]) endselect $aSelMem = $aSel $iGUIGetMsg = GUIGetMsg() Switch $iGUIGetMsg Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd I'm obviously missing something. ;o) Cor
  9. $WS_CLIPCHILDREN is for the parent window and $WS_CLIPSIBLINGS for the kids, right? ;o) Cor
  10. That bar, it flashes and is called the "caret". It's everywhere you type text. Seriously? As for No. 2, no idea. Got an example? ;o) Cor
  11. And what are you looking for? Maybe if you provided a working example of what you are trying to actually do, you would get a better response. My first thought was that this some kind of Rube Goldberg machine, in code. A joke that no one got. ;o) Cor
  12. No, it's definitely what I said. And no more explanation is possible. ;o) Cor
  13. lol! I forgot I'd already asked! Cheers for noticing. Feel free to delete either post, of course. I guess no answers means no one knows. Och well. ;o) Cor
  14. The title says it all, really. Is it possible to drag an image from a web browser (say, Chrome) and have it *do* something in my app, aside from a the "Don't Bother" cursor? I could have sworn I had a GUI that accepted drags from browsers but I can't pin it down. My web searching is just as fruitless. Anyone have any clues? ;o) Cor
  15. Jos! As ever, you are a star! Reset. Very clever! Ta, mate! ;o) Cor
  16. This is a magnifier-color-picker thing mostly based on some code I found on Stack Overflow, of all places. At least all the clever bits are from there. I'd love to use this code inside an app I'm working on. But it has an issue. The first time the mag pops up it works perfectly, but the second and subsequent times, it's a boring grey square. One of you smart dudes will probably look at this and go, "Aha!", but I'm stumped. #include <WindowsConstants.au3> #include <WinAPI.au3> #include <StaticConstants.au3> MagWindow() MagWindow() ; Magnifier-Color-Picker.. ; Props to McBarby for the cross-hairs. func MagWindow() global $iMagZoom = 5 global $iMagWidth = Ceiling(100/$iMagZoom) global $iMagHeight = Ceiling(100/$iMagZoom) global $hDCDesk, $hDCZoom, $hPen global $hUser32 = DllOpen("user32.dll") global $hGDI32 = DllOpen("gdi32.dll") global $pixel_color, $mag_open = false local $mX, $mY global $hCross = GUICreate('', 48, 48, -1, -1, $WS_POPUP, $WS_EX_TOPMOST) WinSetTrans($hCross, '', 0) GUISetCursor(3, 1, $hCross) global $hZoom = GUICreate("MagPicker", $iMagWidth * $iMagZoom, $iMagHeight * $iMagZoom, _ MouseGetPos(0), MouseGetPos(1), $WS_POPUP+$WS_BORDER, $WS_EX_TOPMOST) global $mag_label = GUICtrlCreateLabel("placehold", (($iMagHeight * $iMagZoom)/2)+2, ($iMagHeight * $iMagZoom) - 13, _ (($iMagHeight * $iMagZoom)/2)-3, 12, $SS_RIGHT) ; put this after the GUICreate()s so that it will not error on startup with mouse already moving. (now trapped! but we will leave them here.) global $__hMouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam") global $__hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hMouseProc), _WinAPI_GetModuleHandle(0)) GUISetState(@SW_SHOW, $hCross) GUISetState(@SW_SHOW, $hZoom) $mag_open = true ; once at start, then from the mouse-callback-function.. _Magnify() while $mag_open Sleep(50) $mX = MouseGetPos(0) $mY = MouseGetPos(1) $pixel_color = Hex(PixelGetColor($mX, $mY), 6) GUICtrlSetData ($mag_label, $pixel_color) wend GUIDelete($hZoom) GUIDelete($hCross) ReleaseHooks() endfunc func _Magnify($_iX=-1, $_iY=-1) local Static $fInit = true if $fInit then $fInit = False $hDCDesk = (DLLCall($hUser32, "int", "GetDC", "hwnd", 0))[0] $hDCZoom = (DLLCall($hUser32, "int", "GetDC", "hwnd", $hZoom))[0] $hPen = (DLLCall($hGDI32, "int", "CreatePen", "int", 0, "int", 3, "int", 0x008b9094))[0] ; 0=PS_SOLID, dark-blue (0x00BBGGRR) DLLCall($hGDI32, "int", "SelectObject", "int", $hDCZoom, "hwnd", $hPen) $_iX = MouseGetPos(0) $_iY = MouseGetPos(1) endif local $iW = $iMagWidth * $iMagZoom, $iH = $iMagHeight * $iMagZoom if not @error then DLLCall($hGDI32, "int", "StretchBlt", "int", $hDCZoom, "int", _ 0, "int", 0, "int", $iW, "int", $iH, "int", $hDCDesk, "int", _ $_iX - $iMagWidth/2, "int", $_iY - $iMagHeight/2, "int", $iMagWidth ,"int", $iMagHeight, _ "long", $SRCCOPY) ; draw the crosshair (start x, start y, end x, end y) _GDI32_DrawLine($hDCZoom, ($iW/2)-2, $iH/8, ($iW/2)-2, 4*($iH/8)-6, $hGDI32) ; vertical top _GDI32_DrawLine($hDCZoom, ($iW/2)-2, 5*($iH/8)-10, ($iW/2)-2, 7*($iH/8), $hGDI32) ; vertical bottom _GDI32_DrawLine($hDCZoom, $iW/8, ($iH/2)-2, (3*($iW/8))+6, ($iH/2)-2, $hGDI32) ; horizontal left _GDI32_DrawLine($hDCZoom, 4*($iW/8)+3, ($iH/2)-2, 7*($iW/8), ($iH/2)-2, $hGDI32) ; horizontal right endif endfunc func _GDI32_DrawLine(ByRef $_hDC, $_iX0, $i_Y0, $_iX1, $i_Y1, $_hDll=-1) If $_hDll = -1 then $_hDll = "gdi32.dll" Local $tCurrent = DllStructCreate("struct; long X;long Y; endstruct") DllCall($_hDll, "int", "MoveToEx", "int", $_hDC, "int", $_iX0, "int", $i_Y0, "ptr", DllStructGetPtr($tCurrent)) DllCall($_hDll, "int", "LineTo", "int", $_hDC, "int", $_iX1, "int", $i_Y1) return $tCurrent endfunc func _MouseProc($_nCode, $_wParam, $_lParam) local $tMSLLHOOKSTRUCT = DllStructCreate("struct; long X;long Y; endstruct; " & _ "DWORD mouseData; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo;endstruct", $_lParam) if $_nCode < 0 Then Return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam) local $iX = $tMSLLHOOKSTRUCT.X, $iY = $tMSLLHOOKSTRUCT.Y switch $_wParam case $WM_LBUTTONDOWN CloseMag() case $WM_MOUSEMOVE if not $mag_open then return WinMove($hCross, "", $iX -24, $iY -24) Local $iXz = ($iX +24 + $iMagWidth*$iMagZoom > @DesktopWidth) ? $iX -(24 + $iMagWidth*$iMagZoom) : $iX +24 Local $iYz = ($iY +24 + $iMagHeight*$iMagZoom > @DesktopHeight) ? $iY -(24 + $iMagHeight*$iMagZoom) : $iY +24 WinMove($hZoom, "", $iXz + $iMagWidth/2, $iYz) _Magnify($iX, $iY) endswitch return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam) endfunc func ReleaseHooks() DLLCall($hUser32, "int", "ReleaseDC", "int", $hDCZoom, "hwnd", $hPen) DLLCall($hUser32, "int", "ReleaseDC", "int", $hDCDesk, "hwnd", 0) DLLCall($hUser32, "int", "ReleaseDC", "int", $hDCZoom, "hwnd", 0) DllClose($hUser32) DllClose($hGDI32) _WinAPI_UnhookWindowsHookEx($__hHook) DllCallbackFree($__hMouseProc) endfunc func CloseMag() ; called by mouse left click $mag_open = false endfunc Thanks for any and all insights! ;o) Cor
  17. In case anyone wanted to play with that code (which definitely wants playing with) in English.. https://pastebin.com/DxBcu4NX ;o) Cor
  18. Ahh.. TraySetClick(). That's the one I was thinking of. ;o) Cor
  19. You could mess with the resources of the compiled app with a resource editor but this may break your app in unexpected ways as well as the EULA. Check that. A much better idea is to debug your program so there are no errors. ;o) Cor
  20. Check the help file for AutoItSetOption(). Start with "TrayMenuMode". ;o) Cor
  21. We've been able to drag images out of web browsers since forever. Can I drag one into my GUI? Or rather, can I drag an image from my web browser onto my GUI and have my app *do* something with that image? My fingers bleed from searching. Any ideas much appreciated! ;o) Cor
  22. Excellent. Any idea when this will make into a proper release? ;o) Cor
  23. JohnOne, the last time I looked, the functions on the forum used gobs of memory to do the exact same thing. If I missed another, better method, feel free to point me in that direction. And I've not come across any mention of these gotchas before, ergo, they are new. guinness, why not? ;o) Cor
  24. #include <GuiTab.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> AutoItSetOption("GUIOnEventMode", 1) global $tabspace, $tabspace_opt, $old_tab, $tabs[3] = [2], $opt_tabs[6] = [5] global $width = 400, $height = 300, $x = -1, $y = -1 $ExampleGUI = GUICreate("example", $width, $height, $x, $y, BitOr($WS_CAPTION, $WS_SYSMENU, $WS_MINIMIZEBOX, $WS_SIZEBOX)) GUISetOnEvent($GUI_EVENT_CLOSE, "DoExit", $ExampleGUI) $opt_gui = GUICreate("opt_child", $width, $height-50, 3, 5, BitOR($WS_CHILD, $WS_TABSTOP), -1, $ExampleGUI) $tabspace_opt = GUICtrlCreateTab(3, 2, $width-20, $height-20, BitOr($TCS_BUTTONS, $TCS_FLATBUTTONS, $TCS_TOOLTIPS, $TCS_HOTTRACK, $WS_CHILD, $WS_TABSTOP)) $opt_tabs[1] = GUICtrlCreateTabItem(" Option 1 ") $opt_tabs[2] = GUICtrlCreateTabItem(" Option 2 ") $opt_tabs[3] = GUICtrlCreateTabItem(" Option 3 ") $opt_tabs[4] = GUICtrlCreateTabItem(" Option 4 ") $opt_tabs[5] = GUICtrlCreateTabItem(" Option 5 ") GUICtrlCreateTabItem("") GUISwitch($ExampleGUI) $tabspace = GUICtrlCreateTab(3, 2, $width, $height-5, BitOr($TCS_BOTTOM, $TCS_BUTTONS, $TCS_TOOLTIPS, $TCS_HOTTRACK, $WS_TABSTOP)) GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM) $tabs[1] = GUICtrlCreateTabItem(" Main Tab.. ") $tabs[2] = GUICtrlCreateTabItem(" Options.. ") GUICtrlCreateTabItem("") GUICtrlSetTip($tabs[1], " Tip for the main tab.. ") GUICtrlSetTip($tabs[2], " Tip for the options tab.. ") GUICtrlSetTip($opt_tabs[1], " Tip for options tab 1.. ") GUICtrlSetTip($opt_tabs[2], " Tip for options tab 2.. ") GUICtrlSetTip($opt_tabs[3], " Tip for options tab 3.. ") GUICtrlSetTip($opt_tabs[4], " Tip for options tab 4.. ") GUICtrlSetTip($opt_tabs[5], " Tip for options tab 5.. ") GUISetState(@SW_SHOW, $ExampleGUI) while true local $new_tab = GUICtrlSendMsg($tabspace, $TCM_GETCURSEL, 0, 0) if $new_tab <> $old_tab then if $new_tab = 1 then GUISetState(@SW_SHOW, $opt_gui) else GUISetState(@SW_HIDE, $opt_gui) GUISetState(@SW_SHOW, $ExampleGUI) endif $old_tab = $new_tab endif Sleep(100) wend func DoExit() exit endfunc As you can see, the tooltip for the options tabs 1 & 2 appear when hovering your pointer over the main two tabs. Am I doing something wrong? Or is this a bug? ;o) Cor
  25. Hey, I didn't expect a Nobel for this, but BEJEEEZUS!FuxnFuk! Not only one but two pretty startling AutoIt discoveries (and workarounds) but a free super-useful, super-fast function to boot! Six months, nada. You are a dry bunch! ;o) Cor
×
×
  • Create New...