Repository navigation
Expand file tree
/
Copy pathProgram.cs
More file actions
133 lines (103 loc) · 3.38 KB
/
Copy pathProgram.cs
File metadata and controls
133 lines (103 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using LTRData.Extensions.CommandLine;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Automation;
namespace waitwin;
public static partial class Program
{
#if NET7_0_OR_GREATER
[LibraryImport("user32", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
private static partial nint FindWindowW(string? lpClassName, string lpWindowName);
#else
[DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern nint FindWindowW(string? lpClassName, string lpWindowName);
#endif
public static int Main(params string[] args)
{
var cmds = CommandLineParser.ParseCommandLine(args, StringComparer.Ordinal);
var waitAny = false;
string[] windows = [];
foreach (var cmd in cmds)
{
switch (cmd.Key)
{
case "a":
waitAny = true;
break;
case "":
windows = cmd.Value;
break;
default:
Console.WriteLine($@"Window wait utility - Copyright (c) 2025-2026 Olof Lagerkvist, LTR Data
https://ltr-data.se/opencode.html
Syntax:
waitwin [-a] winTitle1 [winTitle2 ...]
-a Wait for any of specified windows to close. Otherwise, waits for all
of specified windows to close.
Windows can be specified as numeric window handles or window title strings.");
return -1;
}
}
var waits = new List<EventWaitHandle>();
foreach (var window in windows)
{
if (!int.TryParse(window, out var hwnd))
{
var windowTitle = window;
string? className = null;
var delim = windowTitle.IndexOf('\\');
if (delim > 0)
{
className = windowTitle.Substring(0, delim);
windowTitle = windowTitle.Substring(delim + 1);
}
hwnd = (int)FindWindowW(className, windowTitle);
}
if (hwnd == 0)
{
Console.WriteLine($"Window '{window}' not found.");
continue;
}
Console.WriteLine($"{hwnd,7} {window}");
var element = AutomationElement.FromHandle((nint)hwnd);
var wait = new ManualResetEvent(initialState: false);
Automation.AddAutomationEventHandler(
WindowPattern.WindowClosedEvent,
element,
TreeScope.Subtree,
(_, _) => wait.Set());
waits.Add(wait);
}
if (waits.Count == 0)
{
return 0;
}
if (waits.Count == 1)
{
Console.WriteLine("Waiting for close.");
}
else if (waitAny)
{
Console.WriteLine("Waiting for any to close.");
}
else
{
Console.WriteLine("Waiting for all to close.");
}
var i = 0;
if (waitAny)
{
i = WaitHandle.WaitAny([.. waits]);
}
else
{
WaitHandle.WaitAll([.. waits]);
}
Console.WriteLine("Closed.");
Automation.RemoveAllEventHandlers();
waits.ForEach(wait => wait.Close());
return i;
}
}