質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

1825閲覧

Win32 API 「IsWindowVisible」で終了(中断)したUWPアプリが可視Windowと判断されてしまう

username_h

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2021/09/24 11:43

開発環境

<開発環境>
Windows10 Visual Studio 2019
C# .net framework 4.7.2
Windows Formアプリケーション

実現したいこと

自作のアプリケーションのボタンをクリックした際に、
ウィンドウ内の選択されているファイルに対し、コピー&ペーストを行いたい。
(デスクトップ上で選択されているファイルも対象)

自作アプリケーションの一つ後ろのウィンドウに対しては
キーボードイベント「Ctrl+C(V)」で動作はできています。

処理概要

Win32APIの「GetWindow(GW_HWNDNEXT)」と「IsWindowVisible」を使用し、
ひとつ後ろの可視ウィンドウに対してフォーカスをあてて「Ctrl+C(V)」を発行しています。

発生している問題

デスクトップ上で選択されているファイルに対して
キーボードイベント「Ctrl+C(V)」を発行しているが動作していませんでした。
起動した覚えのない、UWPアプリ(天気等のストアアプリ)が
可視ウィンドウとして判定されてしまっているため、
そのアプリに対して「Ctrl+C(V)」を発行しているようです。

その他調査したこと

UWPアプリの状態は、Windows10から追加された「中断」状態となっていました。
おそらくタスクトレイに常駐しているのかと思います。
タスクバーには存在していませんでした。
また、一度起動したペイント3D等も「中断」状態の可視ウィンドウとして
残ってしまっていることがありました。

教えて頂きたいこと

この「中断」状態のUWPアプリを判断し、
可視ウィンドウの判断から除外したいと思っています。
もしくは、他に良い方法があればご教示頂きたいです。
よろしくお願い致します。

ソースコード

C#

1IntPtr handle = GetForegroundWindow(); 2handle = GetWindow(handle, GW_HWNDNEXT); 3 4while (handle != new IntPtr(0)) 5{ 6 if (IsWindowVisible(handle)) 7 { 8 tsb = new StringBuilder(100); 9 GetWindowText(handle, tsb, tsb.Capacity); 10 11 if (tsb.Length > 0) 12 { 13 SetForegroundWindow(handle); 14 break; 15 } 16 } 17 handle = GetWindow(handle, GW_HWNDNEXT); 18} 19「Ctrl+C」発行

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

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

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

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

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

TN8001

2021/09/24 22:38

質問内容がよくわかりませんが、 > この「中断」状態のUWPアプリを判断し、 > 可視ウィンドウの判断から除外したいと思っています。 ができれば解決ということでしょうか? [EnumWindows で見えない UWP アプリを除外したい - みかづきメモ](https://blog.mochizuki.moe/entry/2018/08/09/002742
username_h

2021/09/27 01:32 編集

TN8001様 参考リンクありがとうございます。 「DwmGetWindowAttribute」を使用し、実際に見えないウィンドを除外することができました。 ありがとうございました。
username_h

2021/09/27 01:36

TN8001様 「質問への追記・修正の依頼」で解決した場合のクローズの仕方がわかりませんでした。 恐れ入りますが、ベストアンサーとしたいと思いますので、 お手数ではありますが、回答欄への転記をお願い致します。
TN8001

2021/09/27 06:53

ggっただけで特に確認もしていないので、お手数ですが実際に動いたコードを添えて自己回答で解決済にしていただきたいです(ブログ等は消えてしまうことがあるので)
username_h

2021/09/27 09:13

TN8001様 承知致しました。 ありがとうございました。
guest

回答1

0

自己解決

API「DwmGetWindowAttribute」を使用することにより、
実際には目で見えないUWPアプリを除外することができました。
(投稿時から関数へ変更しています)
TN8001様情報提供ありがとうございました。

C#

1private bool XXX(IntPtr handle) 2{ 3 // 可視不可ウィンドウ 4 if (!NativeMethods.IsWindowVisible(handle)) 5 return false; 6 7 // タイトルなし 8 var tsb = new StringBuilder(1024); 9 NativeMethods.GetWindowText(handle, tsb, tsb.Capacity); 10 if (tsb.Length == 0) 11 return false; 12 13 // WPFウィンドウ 14 NativeMethods.DwmGetWindowAttribute(handle, NativeMethods.DwmWindowAttribute.DWMWA_CLOAKED, out var isCloaked, Marshal.SizeOf(typeof(bool))); 15 if (isCloaked) 16 return false; 17 18 return true; 19}

投稿2021/09/27 09:23

編集2021/09/27 09:24
username_h

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問