Ich habe mal noch gefiltert:
- Parent muss "0" sein
- Fenster muss Titel haben
Hier eine Version, bei der ein Filter für den Titel/ClassName angeben werden kann... und bei jedem Aufruf wird sEnumWnd zurückgesetzt, damit sich die gefundenen Fenster nicht aufsummieren:
import os, strutils, strformat
include winim/[inc\winuser]
proc printf(formatstr: cstring) {.header: "<stdio.h>", varargs.}
type
ConditionPair[T] = object
ifTrue, ifFalse: T
proc `!`*[T](a, b: T): ConditionPair[T] {.inline.} = ConditionPair[T](ifTrue: a, ifFalse: b)
template `?`*[T](cond: bool; p: ConditionPair[T]): T =
(if cond: p.ifTrue else: p.ifFalse)
type
WndID = object
pid, tid: int
EnumWnd = object
hwnd: HWND
class: WideCStringObj
title: WideCStringObj
pid, tid: int
var
sEnumWnd = newSeq[EnumWnd]()
lp: LPARAM
var
classfilter = newWideCString("", 4096)
titlefilter = newWideCString("", 4096)
spacer: string = repeat("-", 128)
fo: string = "HWND : %-18sPID : %6s TID : %6s %54sWindow : %4i|%4i\nTITLE : %s\nCLASSNAME : %s\n%s\n"
# - Parent muss "0" sein
# - Fenster muss Titel haben
proc my_WndEnumProc(hwnd: HWND, lp: LPARAM): WINBOOL {.stdcall.} =
if GetParent(hwnd) == 0:
var buflen = GetWindowTextLengthW(hwnd) + 1
if buflen == 0: return TRUE
var buf = newWideCString("", buflen)
discard GetWindowTextW(hwnd, cast[LPWSTR](addr buf[0]), buflen)
if titlefilter.len > 0:
if fmt"{buf}" != fmt"{titlefilter}": return TRUE
var className = newWideCString("", 4096)
discard GetClassNameW(hwnd, cast[LPWSTR](className), 4096)
if classfilter.len > 0:
if fmt"{className}" != fmt"{classfilter}": return TRUE
var
pPID: LPDWORD
pTID = GetWindowThreadProcessId(hwnd, cast[LPDWORD](addr pPID))
oWndID = WndID(pid: cast[int](pPID), tid: cast[int](pTID))
sEnumWnd.add(EnumWnd(hwnd: hwnd,
class: className,
title: buf,
pid: oWndID.pid,
tid: oWndID.tid))
return TRUE
proc GetEnumWindows(cfilter, tfilter: string): int =
titlefilter = newWideCString(tfilter, tfilter.len + 1)
classfilter = newWideCString(cfilter, cfilter.len + 1)
sEnumWnd = newSeq[EnumWnd]()
EnumWindows(my_WndEnumProc, lp)
result = sEnumWnd.len
proc printEnumWnds(): void =
printf("%s\nclassfilter = %s\ntitlefilter = %s\n%s\n",
spacer, $classfilter, $titlefilter, spacer)
var n = sEnumWnd.len
for i in 0..n - 1:
printf(fo, toHex(sEnumWnd[i].hwnd), $sEnumWnd[i].pid, $sEnumWnd[i].tid, "",
i, sEnumWnd.len, $sEnumWnd[i].title, $sEnumWnd[i].class, spacer)
echo "Es wurde" & (n <= 0 ? " kein" ! (n == 1 ? " ein" ! "n " & $n)) &
" Window" & (n <= 1 ? "" ! "s") & " gefunden...\n" &
spacer & "\n"
if GetEnumWindows("SciTEWindow", "") > 0: printEnumWnds()
if GetEnumWindows("SciTEWindow", r"M:\AutoIt\WakeOnLan.au3 - SciTE") > 0: printEnumWnds()
if GetEnumWindows("", "(Frozen) AutoIt v3 Window Info") > 0: printEnumWnds()
Alles anzeigen
Ausgabe
--------------------------------------------------------------------------------------------------------------------------------
classfilter = SciTEWindow
titlefilter =
--------------------------------------------------------------------------------------------------------------------------------
HWND : 0000000000370F18 PID : 10484 TID : 5544 Window : 0| 2
TITLE : F:\AutoIt\AutoIt3_Tools\OrganizeIncludes\OI_1.0.0.50.au3 - SciTE [9 von 11]
CLASSNAME : SciTEWindow
--------------------------------------------------------------------------------------------------------------------------------
HWND : 00000000030E11B2 PID : 2324 TID : 1976 Window : 1| 2
TITLE : M:\AutoIt\WakeOnLan.au3 - SciTE
CLASSNAME : SciTEWindow
--------------------------------------------------------------------------------------------------------------------------------
Es wurden 2 Windows gefunden...
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
classfilter = SciTEWindow
titlefilter = M:\AutoIt\WakeOnLan.au3 - SciTE
--------------------------------------------------------------------------------------------------------------------------------
HWND : 00000000030E11B2 PID : 2324 TID : 1976 Window : 0| 1
TITLE : M:\AutoIt\WakeOnLan.au3 - SciTE
CLASSNAME : SciTEWindow
--------------------------------------------------------------------------------------------------------------------------------
Es wurde ein Window gefunden...
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
classfilter =
titlefilter = (Frozen) AutoIt v3 Window Info
--------------------------------------------------------------------------------------------------------------------------------
HWND : 0000000003691100 PID : 4684 TID : 10248 Window : 0| 1
TITLE : (Frozen) AutoIt v3 Window Info
CLASSNAME : Au3Info
--------------------------------------------------------------------------------------------------------------------------------
Es wurde ein Window gefunden...
--------------------------------------------------------------------------------------------------------------------------------
Alles anzeigen
--------------------------------------------------------------------------------------------------------------------------------
HWND : 0000000000020CD6 PID : 668 TID : 14828 Window : 633| 876
TITLE : TmainFrm
CLASSNAME : HFS ~ HTTP File Server 2.3m Build 300
--------------------------------------------------------------------------------------------------------------------------------
Hier ist mir übrigens aufgefallen, dass ich TITLE und CLASSNAME bei der Ausgabe vertauscht hatte... habe es korrigiert.