|
1 | 1 | using System;
|
2 | 2 | using System.Runtime.InteropServices;
|
3 |
| -using System.Threading; |
4 |
| -using System.Threading.Tasks; |
5 | 3 | using System.Windows.Interop;
|
6 | 4 | using System.Windows;
|
7 |
| -using Windows.Win32; |
8 | 5 |
|
9 | 6 | namespace Flow.Launcher.Infrastructure
|
10 | 7 | {
|
11 | 8 | public static class Win32Helper
|
12 | 9 | {
|
13 |
| - #region STA Thread |
14 |
| - |
15 |
| - /* |
16 |
| - Found on https://github.com/files-community/Files |
17 |
| - */ |
18 |
| - |
19 |
| - public static Task StartSTATaskAsync(Action action) |
20 |
| - { |
21 |
| - var taskCompletionSource = new TaskCompletionSource(); |
22 |
| - Thread thread = new(() => |
23 |
| - { |
24 |
| - PInvoke.OleInitialize(); |
25 |
| - |
26 |
| - try |
27 |
| - { |
28 |
| - action(); |
29 |
| - taskCompletionSource.SetResult(); |
30 |
| - } |
31 |
| - catch (System.Exception) |
32 |
| - { |
33 |
| - taskCompletionSource.SetResult(); |
34 |
| - } |
35 |
| - finally |
36 |
| - { |
37 |
| - PInvoke.OleUninitialize(); |
38 |
| - } |
39 |
| - }) |
40 |
| - { |
41 |
| - IsBackground = true, |
42 |
| - Priority = ThreadPriority.Normal |
43 |
| - }; |
44 |
| - |
45 |
| - thread.SetApartmentState(ApartmentState.STA); |
46 |
| - thread.Start(); |
47 |
| - |
48 |
| - return taskCompletionSource.Task; |
49 |
| - } |
50 |
| - |
51 |
| - public static Task StartSTATaskAsync(Func<Task> func) |
52 |
| - { |
53 |
| - var taskCompletionSource = new TaskCompletionSource(); |
54 |
| - Thread thread = new(async () => |
55 |
| - { |
56 |
| - PInvoke.OleInitialize(); |
57 |
| - |
58 |
| - try |
59 |
| - { |
60 |
| - await func(); |
61 |
| - taskCompletionSource.SetResult(); |
62 |
| - } |
63 |
| - catch (System.Exception) |
64 |
| - { |
65 |
| - taskCompletionSource.SetResult(); |
66 |
| - } |
67 |
| - finally |
68 |
| - { |
69 |
| - PInvoke.OleUninitialize(); |
70 |
| - } |
71 |
| - }) |
72 |
| - { |
73 |
| - IsBackground = true, |
74 |
| - Priority = ThreadPriority.Normal |
75 |
| - }; |
76 |
| - |
77 |
| - thread.SetApartmentState(ApartmentState.STA); |
78 |
| - thread.Start(); |
79 |
| - |
80 |
| - return taskCompletionSource.Task; |
81 |
| - } |
82 |
| - |
83 |
| - public static Task<T?> StartSTATaskAsync<T>(Func<T> func) |
84 |
| - { |
85 |
| - var taskCompletionSource = new TaskCompletionSource<T?>(); |
86 |
| - |
87 |
| - Thread thread = new(() => |
88 |
| - { |
89 |
| - PInvoke.OleInitialize(); |
90 |
| - |
91 |
| - try |
92 |
| - { |
93 |
| - taskCompletionSource.SetResult(func()); |
94 |
| - } |
95 |
| - catch (System.Exception) |
96 |
| - { |
97 |
| - taskCompletionSource.SetResult(default); |
98 |
| - } |
99 |
| - finally |
100 |
| - { |
101 |
| - PInvoke.OleUninitialize(); |
102 |
| - } |
103 |
| - }) |
104 |
| - { |
105 |
| - IsBackground = true, |
106 |
| - Priority = ThreadPriority.Normal |
107 |
| - }; |
108 |
| - |
109 |
| - thread.SetApartmentState(ApartmentState.STA); |
110 |
| - thread.Start(); |
111 |
| - |
112 |
| - return taskCompletionSource.Task; |
113 |
| - } |
114 |
| - |
115 |
| - public static Task<T?> StartSTATaskAsync<T>(Func<Task<T>> func) |
116 |
| - { |
117 |
| - var taskCompletionSource = new TaskCompletionSource<T?>(); |
118 |
| - |
119 |
| - Thread thread = new(async () => |
120 |
| - { |
121 |
| - PInvoke.OleInitialize(); |
122 |
| - try |
123 |
| - { |
124 |
| - taskCompletionSource.SetResult(await func()); |
125 |
| - } |
126 |
| - catch (System.Exception) |
127 |
| - { |
128 |
| - taskCompletionSource.SetResult(default); |
129 |
| - } |
130 |
| - finally |
131 |
| - { |
132 |
| - PInvoke.OleUninitialize(); |
133 |
| - } |
134 |
| - }) |
135 |
| - { |
136 |
| - IsBackground = true, |
137 |
| - Priority = ThreadPriority.Normal |
138 |
| - }; |
139 |
| - |
140 |
| - thread.SetApartmentState(ApartmentState.STA); |
141 |
| - thread.Start(); |
142 |
| - |
143 |
| - return taskCompletionSource.Task; |
144 |
| - } |
145 |
| - |
146 |
| - #endregion |
147 |
| - |
148 | 10 | #region Blur Handling
|
149 | 11 |
|
150 | 12 | /*
|
|
0 commit comments