やりたいこと
AutoIt的なものを自前でやってみたいなぁとおもってます。まずは、簡単そうなWinExsists()を作ってみようかと思います
AutoItのWinExistsってどんな関数?
引数titleとマッチする、ウィンドウがあるかどうかを教えてくれる関数です。比較する対象は、ウィンドウタイトル / クラス名 / ウィンドウハンドルです。
詳細はこちら、
http://www.autoitscript.com/autoit3/docs/functions/WinExists.htm
bool WinExists ( "title" // チェックする title/hWnd/class [, "text"] // オプションの引数 ウィンドウのどっかにあるテキストと比較するみたい。 )
自前のWinExistsは?
自前の関数では、以下のようにしたいと思います。(1) オプションの引数は、ひとまずよくわからないので、除外して考えます。
(2) hWndでもチェックできますが、難しそうなのでやめておこうかと思います。
(3) 文字列は、大文字/小文字は考慮せずに、含まれているかどうかで判断する。
ちょっとシンプルになってこんな感じの関数となります。
bool WinExists ( "title" // チェックする title/class )
こんな風にしました。
UIはこんな感じです。このまえやったEnumwindowをちょろっと変えて、作りました。
ソース
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //add using System.Runtime.InteropServices; using System.Collections; using System.Text.RegularExpressions; namespace AutoTest2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnWinExist_Click(object sender, EventArgs e) { bool bExists = WinExists( tBWinExistTitle.Text ); if (bExists) { // あった。 tBWinExistRet.Text = "Exist"; } else { // なかった。 tBWinExistRet.Text = "Not Exist"; } } //-------------------- // これ。 //-------------------- private bool WinExists(string title) { bool bret = false; if (!title.Equals(string.Empty)) // 入力されなかったらやめる。 { // 存在するウィンドウのタイトルとクラス名の一覧を取得 ArrayList alist = new ArrayList(); Win32.EnumWindows(new Win32.EnumWindowsProc(Win32.EnumTheWindows), ref alist); // マッチするかチェック。 foreach (WndInfo winf in alist) { // titleとマッチするか? if (winf.title.IndexOf(title, StringComparison.OrdinalIgnoreCase) >= 0) { bret = true; break; } // クラス名とマッチするか? if (winf.className.IndexOf(title, StringComparison.OrdinalIgnoreCase) >= 0) { bret = true; break; } } } return bret; } } //-------------------- // win32 api //-------------------- public class Win32 { public delegate bool EnumWindowsProc(IntPtr hWnd, ref ArrayList data); [DllImport("user32.dll", CharSet = CharSet.Unicode)] protected static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); [DllImport("user32.dll", CharSet = CharSet.Unicode)] protected static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("user32.dll")] public static extern bool EnumWindows(EnumWindowsProc enumProc, ref ArrayList data); [DllImport("user32.dll")] protected static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); public static bool EnumTheWindows(IntPtr hWnd, ref ArrayList alist) { int size = GetWindowTextLength(hWnd); if (size++ > 0 && IsWindowVisible(hWnd)) { // ウィンドウタイトル StringBuilder sbTitle = new StringBuilder(size); GetWindowText(hWnd, sbTitle, size); // class name StringBuilder className = new StringBuilder(256); GetClassName(hWnd, className, className.Capacity); alist.Add(new WndInfo(sbTitle.ToString(), className.ToString())); } return true; } } //-------------------- // window の情報 を保持する 構造体 //-------------------- public struct WndInfo { public string title; public string className; public WndInfo(string Title, string ClassName) { title = Title; className = ClassName; } } }
0 件のコメント:
コメントを投稿