特定のウインドウ名をもつウインドウを開けないように監視し続けるアプリケーションを作ろうと思っています。
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,095
特定のウインドウ名をもつウインドウを開けないように監視し続けるアプリケーションを作ろうと思っています。
例はfirefoxのアドオンの画面
(ウインドウ名アドオンマネージャー - Mozilla Firefox)です。
プログラムは主にこのサイトを参考にしました。
下のプログラムは一様コンパイルが通りました。
実行するとfirefoxのアドオンマネージャーが開いているとfirefoxをまるごと
閉じられます。
しかしこのままだと目的にはあっていません。
プログラムを常駐させておいて、
プログラムを強制終了で停止させない限り、アドオンマネージャー - Mozilla Firefoxが開けないようにしたいです。
コマンドをどのようにすればいいのかわからないので具体的に必要なコードをお願いします。
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
using System.Collections;
public class Program
{
/// <summary>
/// エントリポイント
/// </summary>
public static void Main()
{
//ウィンドウのタイトルに[アドオンマネージャー]を含むプロセスをすべて取得する
Process[] ps = GetProcessesByWindow("アドオンマネージャー - Mozilla Firefox", null);
//結果を表示する
foreach (Process p in ps)
{
p.Kill();
}
Console.WriteLine("開いてはいけません!!!!!!!!!!!!!!");
Console.ReadLine();
}
/// <summary>
/// 指定された文字列をウィンドウのタイトルとクラス名に含んでいるプロセスを
/// すべて取得する。
/// </summary>
/// <param name="windowText">ウィンドウのタイトルに含むべき文字列。
/// nullを指定すると、classNameだけで検索する。</param>
/// <param name="className">ウィンドウが属するクラス名に含むべき文字列。
/// nullを指定すると、windowTextだけで検索する。</param>
/// <returns>見つかったプロセスの配列。</returns>
public static Process[] GetProcessesByWindow(
string windowText, string className)
{
//検索の準備をする
foundProcesses = new ArrayList();
foundProcessIds = new ArrayList();
searchWindowText = windowText;
searchClassName = className;
//ウィンドウを列挙して、対象のプロセスを探す
EnumWindows(new EnumWindowsDelegate(EnumWindowCallBack), IntPtr.Zero);
//結果を返す
return (Process[])foundProcesses.ToArray(typeof(Process));
}
private static string searchWindowText = null;
private static string searchClassName = null;
private static ArrayList foundProcessIds = null;
private static ArrayList foundProcesses = null;
private delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc,
IntPtr lparam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowText(IntPtr hWnd,
StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetClassName(IntPtr hWnd,
StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowThreadProcessId(
IntPtr hWnd, out int lpdwProcessId);
private static bool EnumWindowCallBack(IntPtr hWnd, IntPtr lparam)
{
if (searchWindowText != null)
{
//ウィンドウのタイトルの長さを取得する
int textLen = GetWindowTextLength(hWnd);
if (textLen == 0)
{
//次のウィンドウを検索
return true;
}
//ウィンドウのタイトルを取得する
StringBuilder tsb = new StringBuilder(textLen + 1);
GetWindowText(hWnd, tsb, tsb.Capacity);
//タイトルに指定された文字列を含むか
if (tsb.ToString().IndexOf(searchWindowText) < 0)
{
//含んでいない時は、次のウィンドウを検索
return true;
}
}
if (searchClassName != null)
{
//ウィンドウのクラス名を取得する
StringBuilder csb = new StringBuilder(256);
GetClassName(hWnd, csb, csb.Capacity);
//クラス名に指定された文字列を含むか
if (csb.ToString().IndexOf(searchClassName) < 0)
{
//含んでいない時は、次のウィンドウを検索
return true;
}
}
//プロセスのIDを取得する
int processId;
GetWindowThreadProcessId(hWnd, out processId);
//今まで見つかったプロセスでは無いことを確認する
if (!foundProcessIds.Contains(processId))
{
foundProcessIds.Add(processId);
//プロセスIDをからProcessオブジェクトを作成する
foundProcesses.Add(Process.GetProcessById(processId));
}
//次のウィンドウを検索
return true;
}
}
コード
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.98%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/09/23 16:01