AndyS01 Posted October 20, 2010 Share Posted October 20, 2010 I have an AutoIT script that I want to have only one instance of. When I run the script a second time, I want to kill the first one and allow the second one to start up. At startup, I call a function that looks for another instance and when it finds it, does a WinClose() to kill it. The problem is that the WinClose() returns a good status, but does not kill the other window. I've tried WinKill() and that does not work either. If I change the code to kill some other window (e.g. Notepad), it kills that window OK. I suspect that I am not trapping some signal in the running script. Here is the startup function: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; runUnique() - See IF another instance of this script is ; already running and IF so, kill it. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func runUnique() Local $hWnd, $title = $sCurrentTitle ; ($sCurrentTitle is defined elsewhere) IF (WinActivate($title, "") <> 0) Then $hWnd = WinGetHandle($title, "") IF (IsHWnd($hWnd)) Then IF (NOT WinClose($hWnd)) Then WinKill($hWnd) IF (WinActivate($title, "") <> 0) Then MsgBox(0, "ERROR", "Cannot kill window") Else MsgBox(0, "INFO", "Killed other window") EndIF Else MsgBox(0, "ERROR", "Cannot get win handle") EndIF EndIF EndFunc ;==>runUnique I don't get any errors, but the running script is not killed. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted October 20, 2010 Moderators Share Posted October 20, 2010 AndyS01, Your code works fine for me. Does the instance you are trying to close have open files? Is it being accessed by another app? Something of this nature might prevent it closing. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
AndyS01 Posted October 20, 2010 Author Share Posted October 20, 2010 The app opens an AutoIT source file and gathers a function list, then closes the file. The app then presents the function list in a listbox and when a function is doubleclicked, goes there in the SCite editor (much like what happens when you press ALT-L, but with a separate non-modal window). I have these hooks to exit my script: OnAutoItExitRegister("ExitStageLeft_normal") GUISetOnEvent($GUI_EVENT_CLOSE, "Event_GUIClose") Both of these functions call my general cleanup and exit function. This function saves the window settings to the registry and does an exit(0). I commented out all of my file I/O stuff and it still fails. I could send you the script if you want to look at it. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted October 21, 2010 Moderators Share Posted October 21, 2010 AndyS01, Just post it here. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
AndyS01 Posted October 21, 2010 Author Share Posted October 21, 2010 OK, after stripping out most of the code, I got it working, but it looks like an AutoIT bug or restriction. When I included a "Opt("GuiCloseOnESC", 0)" statement in my code, it failed, when I commented it out, it worked. Here is a stripped down test script that you can use to verify this: expandcollapse popup#include <GuiConstantsEx.au3> #include <GuiListView.au3> [b]Opt("GuiCloseOnESC", 0)[/b] Global $sCurrentTitle = "Test WinClose()" runUnique() ; Kill off any currently running version of this script $hGUI = GUICreate($sCurrentTitle, 300, 200) $hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 2, 2, 296, 196, $LVS_REPORT) For $i = 1 To 10 _GUICtrlListView_AddItem($hListView, @HOUR & ":" & @MIN & ":" & @SEC & " - " & $i) _GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem " & $i, 1) Next GUISetState() Do Until GUIGetMsg() = $GUI_EVENT_CLOSE exit (1) Func runUnique() Local $hWnd, $res, $title = $sCurrentTitle if (WinActivate($title, "") <> 0) Then $hWnd = WinGetHandle($title, "") If (Not IsHWnd($hWnd)) Then $hWnd = HWnd($hWnd) if (IsHWnd($hWnd)) Then $res = WinClose($hWnd) if ($res == 0) Then ConsoleWrite("+++: WinClose() failed") $res = WinKill($hWnd) ConsoleWrite("+++: WinKill() returned " & $res & @CRLF) if ($res == 0) Then ConsoleWrite("+++: WinKill() failed") EndIf EndIf if (WinActivate($title, "") <> 0) Then MsgBox(0, "ERROR", "Cannot kill window") Else MsgBox(0, "INFO", "Killed other window") EndIf Else MsgBox(0, "ERROR", "Cannot get win handle") EndIf EndIf EndFunc ;==>runUnique Compile the script (F7), then open a DOS window in the same directory and run the program twice. The second time should kill the first instance and start a new one. The behavior is different, depending on whether the "Opt("GuiCloseOnESC", 0)" line is commented in or out. Do you see this behavior? If so, what's happening? AndyS01 Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted October 21, 2010 Moderators Share Posted October 21, 2010 AndyS01,I can confirm the problem - but I have absolutely no idea why it happens. Looks like you get to open a new bug ticket in Trac! But I can close the old window, with Opt("GuiCloseOnESC", 0) active, by using ProcessClose like this:Func runUnique() Local $hWnd, $title = $sCurrentTitle, $iPID If WinExists($title, "") Then $hWnd = WinGetHandle($title, "") _WinAPI_GetWindowThreadProcessId($hWnd, $iPID) ProcessClose($iPID) If WinExists($title, "") Then MsgBox(0, "ERROR", "Cannot kill window") Else MsgBox(0, "INFO", "Killed other window") EndIf EndIf EndFunc ;==>runUniqueI hope that lets you progress while the "GuiCloseOnESC" matter gets resolved. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
AndyS01 Posted October 21, 2010 Author Share Posted October 21, 2010 Excellent suggestion!! Now I can use "GuiCloseOnESC" the way I want to. So many ways to skin this cat!!! BTW: Where do I go to to report this problem? Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted October 21, 2010 Moderators Share Posted October 21, 2010 AndyS01,Bug Reports and Feature RequestsThe "New Ticket" button is at top-right. Explain the problem clearly and put in a minimalist reproducer script (I would cut down the one you already have even further). Then wait - they are are bit busy at the moment, so do not hold your breath. Glad you like the other method. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
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