回答編集履歴

3

DllImportのCharSetを追記

2020/08/29 08:43

投稿

shiena
shiena

スコア1827

test CHANGED
@@ -179,3 +179,21 @@
179
179
  }
180
180
 
181
181
  ```
182
+
183
+
184
+
185
+ ## 追記3
186
+
187
+
188
+
189
+ DllImportはCharSetを指定できるのですがデフォルトはCharSet.Ansiのため日本語だとうまくいかないのが原因でした。なのでFindWindowでも以下のようにCharSet.Unicodeを指定すると元のスクリプトでも動きます。
190
+
191
+
192
+
193
+ ```cs
194
+
195
+ [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Unicode)]
196
+
197
+ public static extern int FindWindow(String className, String windowName);
198
+
199
+ ```

2

RuntimeInitializeOnLoadMethodAttributeを使う

2020/08/29 08:43

投稿

shiena
shiena

スコア1827

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- ## 追記
27
+ ## 追記1
28
28
 
29
29
 
30
30
 
@@ -69,3 +69,113 @@
69
69
  // handle = FindWindow(null, WINDOW_NAME); // 指定したウィンドウを取得
70
70
 
71
71
  ```
72
+
73
+
74
+
75
+ ## 追記2
76
+
77
+
78
+
79
+ GetActiveWindowはアプリが非アクティブだとnullを返すのでスプラッシュ画面が出ている間に他のアプリをアクティブにするとタイトルバーを非表示にできません。そのため、RuntimeInitializeOnLoadMethodAttributeとRuntimeInitializeLoadType.BeforeSplashScreenを組み合わせるとアプリ起動直後からタイトルバーを消す事ができます。
80
+
81
+
82
+
83
+ ```cs
84
+
85
+ using UnityEngine;
86
+
87
+ using System;
88
+
89
+ using System.Runtime.InteropServices;
90
+
91
+
92
+
93
+ public static class DisvisibleTitleBar
94
+
95
+ {
96
+
97
+ [DllImport("user32.dll")]
98
+
99
+ static extern int GetActiveWindow();
100
+
101
+ [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
102
+
103
+ private static extern uint GetWindowLong(int hWnd, int nIndex);
104
+
105
+ [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
106
+
107
+ private static extern uint SetWindowLong(int hWnd, int nIndex, uint dwNewLong);
108
+
109
+ [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
110
+
111
+ private static extern int SetWindowPos(int hwnd, int hwndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
112
+
113
+
114
+
115
+ const int GWL_STYLE = -16; // ウィンドウスタイルを書き換えるためのオフセット
116
+
117
+ const int WS_BORDER = 0x00800000; // 境界線を持つウィンドウを作成
118
+
119
+ const int WS_DLGFRAME = 0x00400000; // ダイアログボックスのスタイルの境界を持つウィンドウを作成
120
+
121
+ const int WS_CAPTION = WS_BORDER | WS_DLGFRAME; // タイトルバーを持つウィンドウを作成
122
+
123
+
124
+
125
+ const int HWND_TOP = 0x0; // 最前面に表示
126
+
127
+ const uint SWP_NOSIZE = 0x1; // 現在のサイズを維持(cxとcyパラメータを無視)
128
+
129
+ const uint SWP_NOMOVE = 0x2; // 現在の位置を維持(xとyパラメータを無視)
130
+
131
+ const int SWP_FRAMECHANGED = 0x0020; // SetWindowLongの内容を適用
132
+
133
+ const int SWP_SHOWWINDOW = 0x0040; // ウィンドウを表示
134
+
135
+
136
+
137
+ [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
138
+
139
+ static void Init()
140
+
141
+ {
142
+
143
+
144
+
145
+ #if UNITY_EDITOR
146
+
147
+
148
+
149
+ #else
150
+
151
+
152
+
153
+ int handle = GetActiveWindow(); // アプリのウィンドウを取得
154
+
155
+
156
+
157
+ // タイトルバーを非表示
158
+
159
+ uint style = GetWindowLong(handle, GWL_STYLE); // ウィンドウの情報を取得
160
+
161
+ SetWindowLong(handle, GWL_STYLE, style ^ WS_CAPTION); // ウィンドウの属性を変更
162
+
163
+
164
+
165
+ // SetWindowLongによる変更を適用
166
+
167
+ SetWindowPos(handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED | SWP_SHOWWINDOW);
168
+
169
+
170
+
171
+ #endif
172
+
173
+
174
+
175
+ }
176
+
177
+
178
+
179
+ }
180
+
181
+ ```

1

プロダクト名が日本語の場合を追記

2020/08/29 07:07

投稿

shiena
shiena

スコア1827

test CHANGED
@@ -21,3 +21,51 @@
21
21
  タイトルバーがないので移動できません。
22
22
 
23
23
  更に右上の×ボタンもないので終了するためにはAlt+F4やタスクマネージャーからタスクの終了を行う事になります。
24
+
25
+
26
+
27
+ ## 追記
28
+
29
+
30
+
31
+ プロダクト名に日本語などのアスキー文字以外を使っている場合はFindWindowでウインドウを見つけられないようです。
32
+
33
+
34
+
35
+ その場合は以下のようにGetActiveWindowでアプリ自身のハンドラーを使えば非表示にできます。
36
+
37
+
38
+
39
+ ```cs
40
+
41
+ // これを追加
42
+
43
+ [DllImport("user32.dll")]
44
+
45
+ static extern int GetActiveWindow();
46
+
47
+
48
+
49
+ // こっちは使わない
50
+
51
+ // [DllImport("user32.dll", EntryPoint = "FindWindow")]
52
+
53
+ // public static extern int FindWindow(String className, String windowName);
54
+
55
+
56
+
57
+ void Start()
58
+
59
+ {
60
+
61
+ // アプリ自身のハンドラーを取得する
62
+
63
+ handle = GetActiveWindow();
64
+
65
+
66
+
67
+ // こっちは使わない
68
+
69
+ // handle = FindWindow(null, WINDOW_NAME); // 指定したウィンドウを取得
70
+
71
+ ```