「質問への追記・修正の依頼」でいくつか既にコメントしたように、IE11の通知バーなどのウィンドウは一般的なダイアログボックスのウィンドウではなく、ウィンドウクラスが"DirectUIHWND"と言う名前のウィンドウです。(通常のダイアログボックスは"#32770")下図のウィンドウがその一部ですね。
通知バーやダウンロードの表示ウィンドウが、閉じても残ってしまいます。残らないように完全に消す方法
については、少なくとも当方の環境ではこのウィンドウのウィンドウハンドルを得た後、PostMessage APIでウィンドウメッセージ WM_CLOSE を送出することで通知バーが破棄されることを確認しました。先のコメント中、DestroyWindow APIでの方法も提示しましたが、これは失敗し、GetLastError APIでエラーコード5
(ERROR_ACCESS_DENIED
/"アクセスが拒否されました。"
)が返ります。さすがに外部プログラムから実行することは無理があるようです。
確認したときのWin32ネイティブのコードを抜粋して以下に載せます。通知バーのウィンドウハンドルの値は、Visual Studio に添付のツール、Spy++を使って得たものです。
C
1/* 確認時のコードを抜粋したもの。
2#include <Windows.h>
3
4HWND hwnd = ??? /* 通知バーのウィンドウハンドル */
5
6/* まず、DestroyWindow()を実行してみる。 */
7BOOL succeeded = DestroyWindow(hwnd);
8if (succeeded) {
9 ;
10} else {
11 /* エラーになります。値は5(ERROR_ACCESS_DENIED) */
12 DWORD error = GetLastError();
13}
14
15/* DestroyWindowがダメならWM_CLOSEをポストしてみる。 */
16succeeded = PostMessage(hwnd, WM_CLOSE, 0, 0);
17if (succeeded) {
18 ; /* 成功します */
19}
上記に準じるかたちのコードを用いることで、通知バーが表示されている状態でも消えている状態でもPostMessage(hwnd, WM_CLOSE, 0, 0)
でウィンドウは破棄されました。が、外部プログラムから横やりを入れている訳ですからIE11は当然、その事態を把握し切れないと見え、その後、IE11をF5キーの押下などでリフレッシュするとIE11は異常終了で落ちます。IE11は通知バーのウィンドウハンドルを持ったまま処理を続けていたのでしょうから、まぁ、これは仕方が無いですね。正規ではない、言わば不正な使い方をした訳です。
質問者さんとの実行環境は違うので、そちらで試した場合はまた挙動が異なるかもしれません。参考までに当方の環境を以下に簡単に示しておきます。
- Windows 10 Pro 1909 OSビルド18363.1316
- Internet Explorer 11 製品バージョン 11.0.18362.1 (C:\Program Files\Internet Explorer\iexplore.exeのファイルのプロパティで確認)
追記しました:
通知バーが非表示のとき、ウィンドウスタイルのWS_VISIBLE
フラグはリセットされないと[2021/03/18 16:51]の「質問への追記・修正、ベストアンサー選択の依頼」で述べましたが、Spy++の表示だけの問題かどうか気になったので実際に確認してみました。結果としては当初のコメントどおりでした。ですが、IsWindowVisibleと言うウィンドウの表示状態を問うAPIを使うことで通知バーの表示、非表示の状態が分かるので、これが使えると思います。
C
1/* 簡単な確認用コード */
2DWORD style = GetWindowLongA(targetWnd, GWL_STYLE);
3DWORD exStyle = GetWindowLongA(targetWnd, GWL_EXSTYLE);
4BOOL visible = IsWindowVisible(targetWnd);
5
6TCHAR s[256];
7wsprintfW(s, L"visible=%d, WS_VISIBLE=0x%x, style=0x%X, exstyle=0x%X",
8 visible, WS_VISIBLE, style, exStyle);
9MessageBoxW(NULL, s, L"TEST", MB_OK);