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

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

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

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

Q&A

解決済

1回答

456閲覧

特定のウインドウ名をもつウインドウを開けないように監視し続けるアプリケーションを作ろうと思っています。

mercurian-teto

総合スコア75

C#

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

0グッド

0クリップ

投稿2017/09/23 03:15

特定のウインドウ名をもつウインドウを開けないように監視し続けるアプリケーションを作ろうと思っています。

例はfirefoxのアドオンの画面
(ウインドウ名アドオンマネージャー - Mozilla Firefox)です。

プログラムは主にこのサイトを参考にしました。

下のプログラムは一様コンパイルが通りました。
実行するとfirefoxのアドオンマネージャーが開いているとfirefoxをまるごと
閉じられます。
しかしこのままだと目的にはあっていません。
プログラムを常駐させておいて、
プログラムを強制終了で停止させない限り、アドオンマネージャー - Mozilla Firefoxが開けないようにしたいです。
コマンドをどのようにすればいいのかわからないので具体的に必要なコードをお願いします。

C#

1using System; 2using System.Runtime.InteropServices; 3using System.Text; 4using System.Diagnostics; 5using System.Collections; 6 7public class Program 8{ 9 /// <summary> 10 /// エントリポイント 11 /// </summary> 12 public static void Main() 13 { 14 //ウィンドウのタイトルに[アドオンマネージャー]を含むプロセスをすべて取得する 15 Process[] ps = GetProcessesByWindow("アドオンマネージャー - Mozilla Firefox", null); 16 17 //結果を表示する 18 foreach (Process p in ps) 19 { 20 21 p.Kill(); 22 } 23 24 Console.WriteLine("開いてはいけません!!!!!!!!!!!!!!"); 25 Console.ReadLine(); 26 27 } 28 29 /// <summary> 30 /// 指定された文字列をウィンドウのタイトルとクラス名に含んでいるプロセスを 31 /// すべて取得する。 32 /// </summary> 33 /// <param name="windowText">ウィンドウのタイトルに含むべき文字列。 34 /// nullを指定すると、classNameだけで検索する。</param> 35 /// <param name="className">ウィンドウが属するクラス名に含むべき文字列。 36 /// nullを指定すると、windowTextだけで検索する。</param> 37 /// <returns>見つかったプロセスの配列。</returns> 38 public static Process[] GetProcessesByWindow( 39 string windowText, string className) 40 { 41 //検索の準備をする 42 foundProcesses = new ArrayList(); 43 foundProcessIds = new ArrayList(); 44 searchWindowText = windowText; 45 searchClassName = className; 46 47 //ウィンドウを列挙して、対象のプロセスを探す 48 EnumWindows(new EnumWindowsDelegate(EnumWindowCallBack), IntPtr.Zero); 49 50 //結果を返す 51 return (Process[])foundProcesses.ToArray(typeof(Process)); 52 } 53 54 private static string searchWindowText = null; 55 private static string searchClassName = null; 56 private static ArrayList foundProcessIds = null; 57 private static ArrayList foundProcesses = null; 58 59 private delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam); 60 61 [DllImport("user32.dll")] 62 [return: MarshalAs(UnmanagedType.Bool)] 63 private extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, 64 IntPtr lparam); 65 66 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 67 private static extern int GetWindowText(IntPtr hWnd, 68 StringBuilder lpString, int nMaxCount); 69 70 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 71 private static extern int GetWindowTextLength(IntPtr hWnd); 72 73 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 74 private static extern int GetClassName(IntPtr hWnd, 75 StringBuilder lpClassName, int nMaxCount); 76 77 [DllImport("user32.dll", SetLastError = true)] 78 private static extern int GetWindowThreadProcessId( 79 IntPtr hWnd, out int lpdwProcessId); 80 81 private static bool EnumWindowCallBack(IntPtr hWnd, IntPtr lparam) 82 { 83 if (searchWindowText != null) 84 { 85 //ウィンドウのタイトルの長さを取得する 86 int textLen = GetWindowTextLength(hWnd); 87 if (textLen == 0) 88 { 89 //次のウィンドウを検索 90 return true; 91 } 92 //ウィンドウのタイトルを取得する 93 StringBuilder tsb = new StringBuilder(textLen + 1); 94 GetWindowText(hWnd, tsb, tsb.Capacity); 95 //タイトルに指定された文字列を含むか 96 if (tsb.ToString().IndexOf(searchWindowText) < 0) 97 { 98 //含んでいない時は、次のウィンドウを検索 99 return true; 100 } 101 } 102 103 if (searchClassName != null) 104 { 105 //ウィンドウのクラス名を取得する 106 StringBuilder csb = new StringBuilder(256); 107 GetClassName(hWnd, csb, csb.Capacity); 108 //クラス名に指定された文字列を含むか 109 if (csb.ToString().IndexOf(searchClassName) < 0) 110 { 111 //含んでいない時は、次のウィンドウを検索 112 return true; 113 } 114 } 115 116 //プロセスのIDを取得する 117 int processId; 118 GetWindowThreadProcessId(hWnd, out processId); 119 //今まで見つかったプロセスでは無いことを確認する 120 if (!foundProcessIds.Contains(processId)) 121 { 122 foundProcessIds.Add(processId); 123 //プロセスIDをからProcessオブジェクトを作成する 124 foundProcesses.Add(Process.GetProcessById(processId)); 125 } 126 127 //次のウィンドウを検索 128 return true; 129 } 130} 131コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

グローバルフックで WH_CBT をフックしてみては?

投稿2017/09/23 03:45

Zuishin

総合スコア28660

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問