C# で他のアプリケーションを自動操作
タイトルの通りのことをする必要があったので、Web以外では使ったことがなかった C# でプログラムを書いてみました。
C# なかなか便利で、クセも少ない(気がする)のでWindowsでプログラムを書くならこれかなと感じました。
やりかたは、Windows APIを使うため、C++なんかでやるのと全く違いはないです。
クラスの最初にでも、使うWindows APIの定義を書いておきましょう。
const int BM_CLICK=0x00F5;
delegate int WNDENUMPROC(IntPtr hwnd,int lParam);
[DllImport("user32.dll")]
extern static int GetWindowText(IntPtr hWnd,StringBuilder lpStr,int nMaxCount);
[DllImport("user32.dll")]
extern static bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
extern static IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
private static extern int EnumChildWindows(IntPtr hWnd,WNDENUMPROC lpEnumFunc,int lParam);
[DllImport("user32.dll")]
public static extern Int32 PostMessage(IntPtr hWnd,int msg,int wParam,int lParam);
[DllImport("user32.dll")]
static extern IntPtr SetFocus(IntPtr hWnd);
流れとしては、
FindWindow()でお目当てのウィンドウを見つけて、
子ウィンドウとなるボタンをEnumChildWindows()で列挙。
その結果から、お目当てのボタンをみつけて、BM_CLICKをPostMessage()するという感じでやりました。
EnumChildWindows()で列挙した結果は、ArrayListに放り込んであとから検索しています。
C言語だと、リストなんかも自分で書かなくてはなりませんが、
すぐに使える既製品があるのは、便利ですね。
それっぽく実装できたので、ついでに周辺機器もプログラムで制御してみました。
要するに、アプリケーションの再起動及び、周辺機器の再起動を自動でしたかったのです。
以前のブログに書いたような簡単なリレー板を作ってもらって、
それをRS-232CのDTR信号で制御してみました。
C# でDTR信号単独の制御ができるか心配でしたが、
SerialPort port=new SerialPort("COM5",9600,Parity.None,8,StopBits.One);
port.Handshake=Handshake.None;
port.DtrEnable=true;
port.Open();
こんな感じで、サクっと動きました。
port.Close() すればDTRも下がって、リレーがOFFになりました。
なんでもできるぞC#。
これを機会に敬遠していたWindows GUIプログラミングも捗りそうです。