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

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

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

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

Q&A

解決済

2回答

1858閲覧

(部分一致、ワイルドカード)ウインドウ名やプロセス名を指定して強制終了

mercurian-teto

総合スコア75

C#

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

0グッド

0クリップ

投稿2017/10/30 18:35

編集2017/10/30 18:37

指定した文字列に当てはまるプロセス名やウインドウ名に当てはまるプロセスを強制終了させ、サインアウトするプログラムがあります。
下の場合、プロセス名やウインドウ名は完全一致しないと強制終了されません。

ワイルドカードで指定して強制終了させたいです。
youtubeという文字列が一つでも入るウインドウがあれば
listcount++されるといったことがしたいです。
たとえば、
ウインドウ名 (14) YouTube - Mozilla Firefox
→youtubeという文字列が入っているので listcount++
このようなコマンドをだれかご存知ではないですか。
(文字列は大文字小文字を区別しないとします)
プロセス名とウインドウ名2通りできたらお願いします。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Diagnostics; 5using System.Linq; 6using System.Text; 7using System.Collections; 8using System.Threading.Tasks; 9 10namespace simultaneously_prohibited 11{ 12 public partial class NotifyIconWrapper : Component 13 { 14 public NotifyIconWrapper() 15 { 16 InitializeComponent(); 17 while (true) 18 { 19 int listcount = 0; 20 21 22 foreach (var p in Process.GetProcesses()) 23 if (p.MainWindowTitle == "無題 - メモ帳") 24 { 25 listcount++; 26 27 } 28 29 30 31 32 33 34 if (System.Diagnostics.Process.GetProcessesByName("chrome").Length > 0) 35 { 36 listcount++; 37 38 39 } 40 if (listcount >= 1) 41 { 42 ExitWindowsEx(ExitWindows.EWX_LOGOFF | ExitWindows.EWX_FORCE, 0); 43 44 } 45 46 47 // 1秒毎 48 System.Threading.Thread.Sleep(1000); 49 } 50 } 51 public enum ExitWindows : uint 52 { 53 EWX_LOGOFF = 0x00, 54 EWX_SHUTDOWN = 0x01, 55 EWX_REBOOT = 0x02, 56 EWX_POWEROFF = 0x08, 57 EWX_RESTARTAPPS = 0x40, 58 EWX_FORCE = 0x04, 59 EWX_FORCEIFHUNG = 0x10, 60 } 61 62 [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 63 public static extern bool ExitWindowsEx(ExitWindows uFlags, 64 int dwReason); 65

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

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

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

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

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

guest

回答2

0

String.Containsメソッド
単純な部分一致ならこれを使えばいいのではないでしょうか
ワイルドカードを使うなら、正規表現もしくはLINQを利用する形になるのではないかと思います。

投稿2017/10/30 23:53

編集2017/10/31 00:01
YAmaGNZ

総合スコア10222

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

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

0

ベストアンサー

このようなコマンドをだれかご存知ではないですか。
(文字列は大文字小文字を区別しないとします)

コマンドと言いますかこの場合はメソッドやAPI、と言うことになりますが、残念ですがそのような便利なものは無く、自分で実装する必要があります。

以下の例は、質問者様のコードをもとにウィンドウ名かプロセス名で指定の文字列が含まれているか、大文字小文字を区別せずに判定させる例です。判定させるメソッドは IsTarget としています。(質問者様のコードとは違い、listcount変数で数は数えていないのでご注意ください)

// ウィンドウ名に"メモ帳"が含まれているか、 // プロセス名に"chrome"が含まれていればExitWindowsEx() private void MonitorAndExit() { while (true) { bool found = false; foreach (var p in Process.GetProcesses()) { if (IsTarget(p.MainWindowTitle, "メモ帳")) { found = true; } if (IsTarget(p.ProcessName, "chrome")) { found = true; } if (found) { ExitWindowsEx(ExitWindows.EWX_LOGOFF | ExitWindows.EWX_FORCE, 0); } } // 1秒毎 System.Threading.Thread.Sleep(1000); } } // ターゲットか判定する。 // source中にtargetが含まれているか大文字小文字を区別せずに判定 private bool IsTarget(string source, string target) { string upperSource = source.ToUpper(); string upperTarget = target.ToUpper(); bool contained = upperSource.Contains(upperTarget); return contained; }

「*」や「?」等、ワイルドカードのようなものを利用したいというのであれば、正規表現などを使って自分でそれっぽい実装を追加していく必要があるかと思います。(方法自体は質問から逸脱しますのでここでは述べません)

投稿2017/10/31 00:14

dodox86

総合スコア9183

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

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

mercurian-teto

2017/11/01 13:28

皆様回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問