オルタナティブ・ブログ > mtaneda ブログ >

中小企業の開発者は会社で何をしているのか

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プログラミングも捗りそうです。

Comment(0)