Recover accidentally closed window/program

Get help with using AutoHotkey and its commands and hotkeys
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Recover accidentally closed window/program

12 May 2017, 18:38

Sometimes my trigger finger hits the close button faster than I have time to recall exactly what file/folder I had open. Is there a way to reopen, say, a notepad file or explorer folder?

Possibly something to this effect: (pseudo code)

; Close window
^Esc::
WinGet*something*, path, A
recoverthis := path ; possibly save as var? *or* FileAppend, %path%, "C:\My Documents\RecoverThis.txt"
PostMessage, 0x112, 0xF060,,, A ; fancy way to close active
return

; Recover window
+Esc::
Run, %recoverthis% ; if previously saved as var
*or*
FileRead, path, "C:\My Documents\RecoverThis.txt"
Run, %path%
return

I found this on the forums: https://autohotkey.com/board/topic/7086 ... r-windows/ but it seems a bit overkill, and daunting, for such a simple task. Plus, it only recovers explorer windows.
Last edited by chill8888 on 14 May 2017, 19:41, edited 1 time in total.
GEV
Posts: 705
Joined: 25 Feb 2014, 00:50

Re: Recover accidentally closed window/program

13 May 2017, 01:04

Try something like this:

Code: Select all

#NoEnv
#SingleInstance Force
SetTitleMatchMode, 2
RegRead, recent_items_folder, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, recent

F1::
Menu, recent_items, Add
Menu, recent_items, deleteAll
FileList :=  "" ; Initialize to be blank
Loop,  %recent_items_folder%\*.lnk
{
	FileList .= A_LoopFileTimeModified . "`t" . A_LoopFileLongPath . "`n"
	Sort, FileList, R  ;   ; Sort by time modified in reverse order	
}
Sleep, 500
Loop, parse, FileList, `n
{
	If (A_LoopField = "")  ; omit the last linefeed (blank item) at the end of the list.
		continue
	StringSplit, FileItem, A_LoopField, %A_Tab%  ; Split into two parts at the tab char
	; FileItem1 is FileTimeModified and FileItem2 is FileLongPath
	SplitPath, FileItem2,,,, name_no_ext
	IfWinExist, %name_no_ext%
		continue
	Menu, recent_items, Add, %name_no_ext%, reopen
	If (A_Index = 10)
		break
}
Menu, recent_items, show
return

reopen:
Run %recent_items_folder%\%A_ThisMenuItem%.lnk
return
User avatar
jeeswg
Posts: 5442
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Recover accidentally closed window/program

13 May 2017, 07:31

I have this problem every so often also. E.g. I closed a window via clicking or a hotkey, but the wrong window was active, or I wanted to double-check what the window was, or I accidentally clicked Ctrl+N on Notepad. The main thing I want is to simply establish what the window title was, and occasionally I reopen that program manually. One way is to periodically list the windows that have taskbar buttons:

Code: Select all

;periodically append list of taskbar buttons to a file
;DetectHiddenWindows, On
vSleep := 30000
vPath = %A_Desktop%\MyWinList.txt
vFileExists := !!FileExist(vPath)

Loop
{
	vDate := A_Now
	vOutput := ""
	WinGet, vWinList, List

	Loop, % vWinList
	{
		hWnd := vWinList%A_Index%
		if !JEE_WinHasTaskbarButton(hWnd)
			continue
		WinGetClass, vWinClass, % "ahk_id " hWnd
		WinGetTitle, vWinTitle, % "ahk_id " hWnd
		WinGet, vPName, ProcessName, % "ahk_id " hWnd
		WinGet, vPID, PID, % "ahk_id " hWnd
		vDetails := vPID "`t" hWnd "`t" vPName "`t" vWinTitle " [" vWinClass "]"
		vOutput .= vDetails "`n"
	}

	Sort, vOutput
	vOutput := StrReplace(vOutput, "`n", "`r`n")
	FormatTime, vDate, % vDate, HH:mm dd/MM/yyyy
	vFileExists ? (vPfx := "`r`n") : (vPfx := "", vFileExists := 1)
	if !(vOutput = vOutput2)
		FileAppend, % vPfx vDate "`r`n" vOutput, % "*" vPath, UTF-8
	vOutput2 := vOutput
	Sleep, % vSleep
	;MsgBox, % vOutput
}

;==================================================

;not guaranteed to work, tested on Windows 7
;JEE_WinIsTaskbar
JEE_WinHasTaskbarButton(hWnd)
{
	WinGet, vWinStyle, Style, % "ahk_id " hWnd
	if !vWinStyle
		return 0
	if !(vWinStyle & 0x10000000) ;WS_VISIBLE := 0x10000000
		return 0
	if (vWinExStyle & 0x40000000) ;WS_CHILD := 0x40000000
		return 0
	WinGet, vWinExStyle, ExStyle, % "ahk_id " hWnd
	if (vWinExStyle & 0x40000) ;WS_EX_APPWINDOW := 0x40000
		return 1
	if (vWinExStyle & 0x80) ;WS_EX_TOOLWINDOW := 0x80
		return 0
	return 1
}
Useful link:
Determining if a Window Has a Taskbar Button - Stack Overflow
http://stackoverflow.com/questions/2262 ... bar-button

[EDIT:] Other ideas: retrieve window information on certain key presses/clicks, get path from controls or via COM, use Recent Items (My Recent Documents), if you want the command line parameters: get command line for a PID via ComObjGet("winmgmts:").
User avatar
MilesAhead
Posts: 230
Joined: 03 Oct 2013, 09:44

Re: Recover accidentally closed window/program

13 May 2017, 08:39

One thing that bugged me was the lack of an MRU list in Windows for Explorer folders and programs. I wrote a few utilities to watch the active window and make it easier to reopen folders or programs that were recently closed.

These are all fully enabled freewares:

ReOpen - has two list boxes. One for explorer folders the other for programs.

FolderCache - has one list box for recent folders

ReRun - F8 pops up a Toolbar with 32 buttons for recent programs that are no longer running.

ReOpen does not give the option of opening the program with arguments. It just launches the exe.

ReRun used to work very well on 32 bit systems. When compiled as 32 bit it only had to call GetModuleFilename for the active window to get the exe file location and then a couple of other calls to determine working directory and command tail. But 32 bit emulation on x64 OS makes it less reliable. On 32 bit OS it nearly always had the option of running with the same command line args and/or working directory. Often these values are not retrieved on an x64 OS. Buttons with no associated recent program have an R icon from ReRun.exe. Hovering the mouse over a button with an associated program will show the Filename without extension of the program on the top line, the working directory if available on the second line, and the command line arguments, if there were any and it managed to snag them, on the third line of the tooltip.

The recent folder tracking in both FolderCache and ReOpen relies on getting the path from the title bar so that option must be set. Also neither can handle special folders like "Computer" that do not have a drive letter derived path. The method of looping through all the window objects to get the path of any folder or special folder is too slow for polling. It is a performance trade-off. :)

If you would like to try any of them they are available on my page:
http://milesaheadsoftware.org

The documentation for the utilities are in the About Box and the Readme.txt file included in the zip.
"My plan is to ghostwrite my biography. Then hire another writer to put his
name on it and take the blame."

- MilesAhead
User avatar
Exaskryz
Posts: 2876
Joined: 17 Oct 2015, 20:28

Re: Recover accidentally closed window/program

13 May 2017, 09:05

The other approaches are probably better. But I've got a set up that adds a list to a GUI such that when you click an item in this list, it'll launch the file/program. This code is messy with stray lines commented out and some weird if/else sequencing, but it seems to work... (Though I realized I never added the functionality to open Notepad files, though they were being logged. And this code was written over a year ago.)

The basis is that you identify the active window and process, exclude it if you don't want to log it, add the file name and file location into an array, add the file name into a Listbox and if you click in the listbox, it'll run the file location associated with that file name. The messiest part is getting the file location, which is on a program-by-program basis where it automatically launches the Save As dialog to capture that information.

Just throwing this out there in case it's of any use to anybody. (Oh, I didn't include a Gui, Show in this code... Probably put before the WindowLogger: line; I haven't actually tested this code, it's snippets from a much larger project.) It might be combined with the ideas presented above.

Code: Select all

Gui, Add, Listbox, % "x10 y1000 w" viewable-20 " r4 vWindowLog gWindowExecution", Slide Pane
SetTimer, WindowLogger, 1000
Windows:=[]
;If (activewindow="Slide Pane") || (activewindow="Slide Pane.ahk") || (activewindow="File Explorer") || (activewindow="Save As") || (activewindow="Task Switching"
GroupAdd, groupNoSaveAs, Save As
GroupAdd, groupNoSaveAs, Confirm Save As
IgnoreLog:="Slide Pane,Slide Pain.ahk,File Explorer,Save As,Task Switching,Opening - Word,Confirm Save As,Print"

WindowLogger:
ListLines, Off
WinGetActiveTitle, activewindow
;If (activewindow="Slide Pane") || (activewindow="Slide Pane.ahk") || (activewindow="File Explorer") || (activewindow="Save As") || (activewindow="Task Switching")
WinGet, activeprocess, ProcessName, %activewindow%
If (activewindow="Save As")
{
WinWaitClose, Save As ahk_exe %activeprocess%
WinGetActiveTitle, activewindowTWO
Windows[activeWindowTWO]:=""
loggedwindow:=""
Sleep 1000
}
If activewindow in %IgnoreLog%
   return
If !activewindow
   return
If (activeprocess!="firefox.exe") && (activeprocess!="chrome.exe") && (activeprocess!="palemoon.exe") && (activeprocess!="notepad++.exe")
; Then it's not a browser
If (activewindow!=loggedwindow)
{
windowlist:=RegExReplace(windowlist, "\Q|" activewindow "\E", "")
windowlist:="|" activewindow windowlist
GuiControl,, WindowLog, %windowlist%
loggedwindow:=activewindow
}
else
	return
If Windows[activewindow]
	return ; known issue - saving a file in a new location
If (activeprocess="explorer.exe")
{
ControlGetText, TW, ToolbarWindow323, %activewindow%
address:=SubStr(TW,10)
initial_ad:=SubStr(address,2,2)
If (initial_ad != ":\")
address:="C:\Users\%A_UserName%\" . address
Windows[activewindow]:=address
}
If (activeprocess="AcroRd32.exe")
{
Send ^+s
WinWait, Save As,,2 ; ahk_exe %activeprocess% ; Was WinWaitActive
If ErrorLevel
	{
	Send ^+s
	WinWait, Save As,,2
	If ErrorLevel
		{
		loggedwindow:=""
		return
		}
	}
WinMove, Save As, 0, 0, 0, 0
ControlGetText, TW, ToolbarWindow325, Save As
address:=SubStr(TW,10)
ControlGetText, file, Edit1, Save As
initial_ad:=SubStr(address,2,2)
If (initial_ad != ":\")
address:="C:\Users\%A_UserName%\" . address
address.="\" file
WinClose, Save As
Windows[activewindow]:=address
;MsgBox % address "`n" activewindow "`n" Windows[activewindow]
}
If (activeprocess="winword.exe" || activeprocess="excel.exe")
{
Send {F12}
WinWait, Save As,,2
If ErrorLevel
   {
   Send {F12}
   WinWait, Save As,,2
   If ErrorLevel
		{
		loggedwindow:=""
		return
		}
   }
ControlGetText, TW, ToolbarWindow325, Save As
addresS:=SubStr(TW,10)
ControlGetText, file, Edit1, Save As
initial_ad:=SubStr(Address,2,2)
If (initial_ad != ":\")
address:="C:\Users\%A_UserName%\" address
address.="\" file
WinClose, Save As
Windows[activewindow]:=address
}
If (activeprocess="notepad.exe")
{
WinMenuSelectItem, %activewindow%,,File, Save As
WinWait, Save As
DetectHiddenWindows, On
WinHide, Save As
ControlGetText, TW, ToolbarWindow324, Save As
address:=SubStr(TW,10) ; trims off the "Address: " prefix
ControlGetText, file, Edit1, Save As
initial_ad:=SubStr(Address,2,2) ; We want to check if this has the C:\Users\%A_UserName% prefix or not. Things like Documents\Folder\File.txt are possible in this address bar.
if (initial_ad != ":\")
address:="C:\Users\%A_UserName%\" address
address.="\" file
WinClose, Save As
Windows[activewindow]:=address
}
return

WindowExecution:
GuiControlGet, output,, WindowLog
Tooltip % Windows[output]
If (Windows[output])
Run % Windows[output]
Sleep 1000
Tooltip
return
User avatar
MilesAhead
Posts: 230
Joined: 03 Oct 2013, 09:44

Re: Recover accidentally closed window/program

13 May 2017, 10:23

Here is another on a similar idea. Skrommel took a different approach with Gone In 60 Seconds. When you click the 'x' or Alt F4 a window, he hides it. Then if 60 seconds go by without you trying to recover it, he actually closes it. Source is included. It may be worth a search in DonationColder.com because one of the AHK coders may have made some modifications to it. Skrommel no longer hangs at DC but all his utilities posted there have AHK source. Although by now there could be some version changes that break some scripts. Still they may be good starting points for some tasks.

http://www.donationcoder.com/Software/S ... #GoneIn60s
"My plan is to ghostwrite my biography. Then hire another writer to put his
name on it and take the blame."

- MilesAhead
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

14 May 2017, 17:11

Thank you for all the ideas and suggestions! I tested all of them and tailored to my liking. However, I absolutely love the elegant solution of GoneIn60s. That idea allowed me to make a very simple script without the hassle of all the inherent what ifs. Here's what I came up with so far:

Code: Select all

^Esc::
WinGetClass, class, A
If class not in ahk_class WorkerW,Shell_TrayWnd,Button,DV2ControlHost,Progman ; excluded windows
WinGetTitle, window, A
WinHide, %window%
SetTimer, CloseWindow, 20000
return

+Esc::
SetTimer, CloseWindow, Off
WinShow, %window%
WinActivate, %window%
return

CloseWindow:
SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, %window% ; close window
return
I'm not concerned with recovering windows I close with the X button, because if I click that manually, I'm almost always certain I want to close it. My trigger fingers are constantly hovering over the Ctrl Escape side of the keyboard.

One issue I still have though: how can I save more than one window variable? If I close two windows within 20 seconds, I can only recover the last one, and the first one never actually closes, it just stays hidden forever.
User avatar
Exaskryz
Posts: 2876
Joined: 17 Oct 2015, 20:28

Re: Recover accidentally closed window/program

14 May 2017, 19:14

There are a few options. You can increment your variables and make a pseudoarray (window1, window2, etc.). But I think in this case using an actual array would be better, of which you clear the array after the window has become unrecoverable by the +Esc hotkey. What I would do is make all of the windows recover with that hotkey.

Code: Select all

array:=[]
^Esc::
WinGetClass, class, A
If class not in ahk_class WorkerW,Shell_TrayWnd,Button,DV2ControlHost,Progman ; excluded windows
WinGetTitle, window, A
WinHide, %window%
array.Push(window)
SetTimer, CloseWindow, 20000
return

+Esc::
SetTimer, CloseWindow, Off
Loop % array.Length()
{
WinShow, % array[A_Index]
WinActivate, % array[A_Index]
}
array:=[]
return

CloseWindow:
If (array.length()=1) ; only one window left to close. If it's 
    SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, % array.RemoveAt(1) ; close first window in the array
return
This code can still be optimized somehow to make sure you only close a window 20 seconds from the time you hide it. I think - this is untested - that if you hide a window at time 0s and time 10s, the first window will close at time 20s and the second window at time 40s. But the only way I know of to do that is using multiple labels, like CloseWindow1 and CloseWindow2 which can be messy... Might want to use an associated array (array:={}) for something like that, not sure.
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

14 May 2017, 22:27

I tried using your code, but I'm not sure if there's a syntax or logic error somewhere. It doesn't function properly. It hides the window, but then it is unrecoverable. I apologize for not being versed enough to figure it out myself.
User avatar
Exaskryz
Posts: 2876
Joined: 17 Oct 2015, 20:28

Re: Recover accidentally closed window/program

14 May 2017, 22:33

That code runs just fine in its own script for me. Might be an issue if you do not have array:=[] in your auto-execute section.
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

15 May 2017, 00:55

Oh ok thank you. How might I add that to the top of my script?

Also, I've noticed that using WinHide on Windows Media Player once a video is loaded, it only hides the player controls, not the actual program itself. Is this a known problem?
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

15 May 2017, 01:45

Another thing I noticed using this script: if a program was edited during the time it was open, and then subsequently closed via the hotkey, it will eventually prompt to save the file before closing. I updated it with this to restore the window so you can see it as it asks to save. It just checks to see if it's still there, per the save message box, and then restores it. If there's a more intuitive way to accomplish this, please let me know.

Code: Select all

CloseWindow:
SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, %window%
Sleep 500
IfWinExist, %window%
WinShow, %window%
WinActivate, %window%
return
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

15 May 2017, 19:58

I added a boolean check at the beginning to see if the timer exists, meaning the last window is still open and hidden. If it is, the script closes the window and again waits for a potential save dialogue before continuing. So essentially, only one window will ever be hidden and recoverable at a time. I would still like to perfect this with the WMP hide issue, and a totally "recallable" array, I just can't seem to figure those things out. Here's the updated version though:

Code: Select all

^Esc::
WinGetClass, class, A
If class not in ahk_class WorkerW, Shell_TrayWnd, Button, DV2ControlHost, Desktop User Picture, Progman
If TimerOn
{
SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, %window%
Sleep 500
IfWinExist, %window%
WinShow, %window%
WinActivate, %window%
WinWaitClose, %window%
}
WinGetTitle, window, A
WinMinimize, %window% ; added because some programs have separate windows that don't hide with the main one
WinHide, %window%
TimerOn := true
SetTimer, CloseWindow, 20000
return

+Esc::
TimerOn := false
SetTimer, CloseWindow, Off
WinShow, %window%
WinActivate, %window%
return

CloseWindow:
TimerOn := false
SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, %window%
Sleep 500
IfWinExist, %window%
WinShow, %window%
WinActivate, %window%
return
User avatar
MilesAhead
Posts: 230
Joined: 03 Oct 2013, 09:44

Re: Recover accidentally closed window/program

16 May 2017, 08:08

I think the approach I would take would be to use a FIFO queue, which is easily implemented using Object functions such as Push and RemoveAt. Items in the queue should have at least the window handle and the time they were hidden. Periodically a routine should take an entry from the front of the queue and check the hidden time to the current time to see if it is equal to or greater than the limit. If it is too soon to close the window, insert it back at the front of the queue. If it is after the time-out, close the window. The routine should just keep cycling through the queue entries. If the queue is empty it just returns.

So instead of checking if the timer is already running you would call the function that examines the entry, if any exists, at the start of the queue of window items. If the one at the start of the queue is expired, close it and throw away that entry, then check for the next item in the queue in case several were closed at nearly the same time. Once there are no more window items to dequeue and close, the function returns.

Edit: Likewise you would have a handler to keep adding "closed" windows to the end of the queue. Also it may be a good idea if the program is closed to empty out the queue of waiting to be closed windows. Perhaps you could set an .ini file option to either show all the windows in the queue at close of the App and leave them open, or to close them all.
"My plan is to ghostwrite my biography. Then hire another writer to put his
name on it and take the blame."

- MilesAhead
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

16 May 2017, 15:46

Well goodness, if I could do all that I wouldn't be here asking! :lol: All of that was... wait for it... miles ahead of me. :trollface:

I'll keep building on the code I have so far. I need to figure out the array and WMP WinHide/WinMinimize issue. I used Send, #{Down} in place of the added WinMinimize, so at least it gets the WMP window out of the way, but it still shows on the taskbar until ultimately closing.
User avatar
MilesAhead
Posts: 230
Joined: 03 Oct 2013, 09:44

Re: Recover accidentally closed window/program

16 May 2017, 17:47

chill8888 wrote:Well goodness, if I could do all that I wouldn't be here asking! :lol: All of that was... wait for it... miles ahead of me. :trollface:

I'll keep building on the code I have so far. I need to figure out the array and WMP WinHide/WinMinimize issue. I used Send, #{Down} in place of the added WinMinimize, so at least it gets the WMP window out of the way, but it still shows on the taskbar until ultimately closing.
Heh heh. I appreciate the pun. :)

The description I posted, believe it or not, may end up being easier than the method you are trying. Alternating between two or three things can be messier than using the queue. Because with the queue basically you only have to take care of two main tasks. Putting new windows at the end of it, and removing old windows from the beginning. Just imagine the queue is a slow moving stream and you put boats in the water upstream, then after they travel a little distance down stream, you take them out of the water. Doing anything for the first time involves a lot of learning curve. But I am a big believer of the old Niklaus Wirth technique of stepwise refinement. So don't toss the working code you have now. Keep making small improvements. As you go along it is quite common as your understanding increases that another way of doing it may pop into your head. I forget who said it but I remember a writer discussing how to program suggested if you have the time to throw the first design away because you will think of a better method about half way through it. I don't have time to write it and debug it myself. My Laptop is an "open box" given to me as a gift. It will not do some things at all such as running a Restore Point etc. But for surfing and some simple stuff it is OK. I am starting to mess with Android tablets these days and may move towards trying to program some Apps for that platform soon.

I would keep the parallel tracks going. What I do is try to find the simplest example close to what I am trying to do, for instance if you find an example of a FIFO queue in AHK using Object. Then keep adding to it until you flesh it out to what you want. All the while keep improving the initial script because you will learn from testing and modifying it. Just keep plugging away. :headwall: :)
"My plan is to ghostwrite my biography. Then hire another writer to put his
name on it and take the blame."

- MilesAhead
User avatar
chill8888
Posts: 40
Joined: 03 Dec 2016, 01:26

Re: Recover accidentally closed window/program

26 May 2017, 20:35

I found this post addressing the same issue I've had. Nobody has found a solution for this yet?
https://autohotkey.com/board/topic/4378 ... skin-host/

And here's an updated version using ahk_id instead so it's more specific to the window, plus a temp workaround for dealing with WMP.

Code: Select all

^Esc::
WinGetClass, class, A
If class not in ahk_class WorkerW,Shell_TrayWnd,Button,DV2ControlHost,Desktop User Picture,Progman
{
If TimerOn
{
SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, ahk_id %windowid%
Sleep 250
IfWinExist, ahk_id %windowid%
WinShow, ahk_id %windowid%
WinActivate, ahk_id %windowid%
WinWaitClose, ahk_id %windowid%
}
WinGet, windowid, id, ahk_class %class%
If (class = "WMP Skin Host")
{
Send, !{F4} ; only way I know to effectively close WMP
}
Else
{
WinMinimize, ahk_id %windowid%
Sleep 250
WinHide, ahk_id %windowid%
}
TimerOn := true
SetTimer, CloseWindow, 10000
}
return

+Esc::
TimerOn := false
SetTimer, CloseWindow, Off
WinShow, ahk_id %windowid%
Sleep 100
WinRestore, ahk_id %windowid%
WinActivate, ahk_id %windowid%
return

CloseWindow:
TimerOn := false
SetTimer, CloseWindow, Off
DetectHiddenWindows, On
PostMessage, 0x112, 0xF060,,, ahk_id %windowid%
Sleep 250
IfWinExist, ahk_id %windowid%
WinShow, ahk_id %windowid%
Sleep 250
WinRestore, ahk_id %windowid%
WinActivate, ahk_id %windowid%
return

Return to “Ask For Help”

Who is online

Users browsing this forum: afe, Albireo, anhnha, Maxsteinfeld and 108 guests