🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Blue Prism

Blue Prismは、複数ロボットの統括管理RPAです。各企業の事業部門に分散されているロボットに対し、プロセスの制御・監視・実行・スケジュールを行うコンソールでロボットの運用を推進。内部統制を強化できます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

1回答

4268閲覧

通知バーやダウンロードの表示ウィンドウが、閉じても残ってしまいます。残らないように完全に消す方法を教えてください。

sumire_cl

総合スコア228

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Blue Prism

Blue Prismは、複数ロボットの統括管理RPAです。各企業の事業部門に分散されているロボットに対し、プロセスの制御・監視・実行・スケジュールを行うコンソールでロボットの運用を推進。内部統制を強化できます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2021/03/18 03:34

発生している問題・エラーメッセージ

IE11で、リンクを踏んでダウンロードするときとかに出る「通知バー」や「ダウンロードの表示」ウィンドウ(つまりウィンドウクラス#32770のものということでしょうか……)が、閉じるボタンや×をクリックして閉じても、「まだ存在する」と判断されてしまいます。
Blue Prismの場合で言うと、「Window Exists」アクションで調べるとTrueが返ってきてしまう、ということです。
これを存在すると判断されないように、完全にいなくなるようにしたいのです。

親のウィンドウが閉じてもらっては困るので、たとえばウィンドウクラス#32770だけ全員死ねとか、そういったことって可能なのでしょうか?

調べたことと試したこと

たとえばこれはUWSCの質問なんですが通知バーで詰まっていて(未解決、ちょっと内容が違うかも)
UWSCのIE11でのファイルダウンロード時の不具合

UiPath社の記事によると
2019年7月29日 Windows 標準 UI 自動化のヒント

通知バーは、Internet Explorer の起動直後には存在していません。表示する必要が生じた時点で生成されます。ただ一度表示されると、そのあとはウィンドウが閉じたように見えても実際には非表示状態でウィンドウはもとの場所に存在し続けます。ウィンドウスタイルの WS_VISIBLE フラグがリセットされた状態です。

たぶんこれだと思います。存在し続けるというのがまさに今困っていることなので。

当該ウィンドウのプロセスだけkillしたらどうだろうと思って
プロセス名からプロセスIDとウィンドウ名を取得する
これでプロセスIDの一覧を取得し、ウィンドウ名から目的のプロセスIDを割り出して
プロセスIDを指定してtaskkillコマンドで強制終了
とやってみました。

タスクマネージャーを見ると、当該プロセスIDは確かにいなくなったのですが、ウィンドウの存在チェックをすると、やっぱりまだ「存在する」となってしまいます……。

補足情報(FW/ツールのバージョンなど)

IE11、Windows Server2016、Blue Prismは6.3です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/03/18 04:10

> IE11で、リンクを踏んでダウンロードするときとかに出る「通知バー」や「ダウンロードの表示」ウィンドウ(つまりウィンドウクラス#32770のものということでしょうか……) Windows Server2016も無いので質問者さんとまるきり同じ状況は再現できませんが、IE11のそのウィンドウのウィンドウクラスは"#32770"ではありません。それは一般的なダイアログボックスです。IE11のものは、"DirectUIHWND" で、別モノのはずです。(手持ちのWindows10 IE11、11.00.18362.1で確認) Blue Prism の操作は分かりませんが、ウィンドウを特定できて、Windows APIを扱えるなら、DestroyWindowあたりを試してみたらいかがでしょう。ただし、横から無理やりウィンドウを破棄すると、その後のIE11の動きに影響が出るかもしれません。
sumire_cl

2021/03/18 07:43

インフラ神キター!いつもありがとうございます! Blue PrismはAPIいけます、DestroyWindowってWM_CLOSEの後にあるアレですよね…(知識が薄くて使い方はこれから資料を探します)
dodox86

2021/03/18 07:51

> DestroyWindowってWM_CLOSEの後にあるアレですよね… 自分のウィンドウプロシージャで使うときは、そうです。外部のプロセスからだとダメかもしれませんね。あまり期待せず、ダメもとで試してみてください。あと、ウィンドウメッセージWM_CLOSEを目的のウィンドウへPostMessageすることで閉じることができる場合もあります。そのウィンドウがWM_CLOSEを拒絶していたらダメですけど。 ちなみに質問中にリンクのUiPathの情報 > 通知バーは、... ウィンドウスタイルの WS_VISIBLE フラグがリセットされた状態です。 の部分ですが、こちらで(興味で)確認してみた限りでは、通知バーが消えた状態でもWS_VISIBLEフラグは立ったままでした。2019年7月29日の記事ということで、今の最新のWindows 10/IE11では合致しない情報の部分があるかもしれません。
dodox86

2021/03/18 08:34

簡単なWin32ネイティブのテストプログラムを作って試してみたのですが、通知ウィンドウのウィンドウハンドルを直接指定してDestroyWindowを呼び出したところ、エラー(5: ERROR_ACCESS_DENIED)でダメでした。さすがに他プロセスからは無理が過ぎたようです。が、WM_CLOSEをPostMessage()することで通知ウィンドウは一応、消えました。そちらの動作環境で要望通りに使えるとは限りませんが、参考の回答としてそのテストプログラムのコードを後で投稿します。
guest

回答1

0

ベストアンサー

「質問への追記・修正の依頼」でいくつか既にコメントしたように、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);

投稿2021/03/18 14:25

編集2021/03/22 00:02
dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumire_cl

2021/03/21 23:06

ありがとうございます。教えていただいた方法で試してみたところ、閉じた後の挙動が不安定で困ったのですが >その後、IE11をF5キーの押下などでリフレッシュするとIE11は異常終了で落ちます。 これか!やっぱ無理に閉じるとあとが悪いってことですね。 ウィンドウが消えないならAttributeを見ることでどうにか…と思ったのですが >通知バーが消えた状態でもWS_VISIBLEフラグは立ったままでした oh...何か他のアプローチを考えます… ところでspy++って初めて知りました。いいものを教えてくださってありがとうございます。さわってみます。
dodox86

2021/03/21 23:49

> >通知バーが消えた状態でもWS_VISIBLEフラグは立ったままでした > oh...何か他のアプローチを考えます… これについては私も気になっていたので改めて確認してみました。回答中の追記分をご覧ください。
sumire_cl

2021/03/22 00:18 編集

追記読みました。ありがとうございます。とりあえず今は逃げとして「ウィンドウにAttachできなかったら無いものとする」(Blue Prismでは「ウィンドウとして」生きてないものはAttachできないようなので)としていますがスマートではないです…(例外スローされたら正常っていうのは話の筋としておかしい感じがする)。 IsWindowVisibleを見るほうが筋が通っているというか手法として正しいと思うのでこちらを使うのを試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問