ウィンドウを持つプロセスからウィンドウを持つプロセスへのSendMessageは上手く行えたのですが、Windowsサービスプログラム内ではFindWindowでメッセージ送信先のウィンドウハンドルが取得できません。何か違う手法が必要なのでしょうか?
どなたかお助け下さい。
サービスプログラムのハンドルの取得は、OpenSCManagerとOpenService APIで出来ると思うけど。
サービスプログラムのハンドルの取得は、OpenSCManagerとOpenService APIで出来ると思うけど。
多分、EnumProcessesの方だと思います。
質問を訂正します。
Windowsサービスプログラムから他の起動済みプログラム(仮にRecv.exeとする)にメッセージを送信します。Recv.exeはメッセージ内容に添った処理を行った後再度メッセージを待ち合わせます。
と言う仕組みを作りたいのですが、サービスプログラム内ではRecv.exeのウィンドウハンドルが取得できず(FindWindowでは0が帰る)困っています。
どうすればよろしいのでしょうか?お助け下さい。
早々に回答頂いた「それは」さん「monaa」さん、有難うございます。
アドバイスを元に調査作業中です。更にアドバイス願えれば幸いです。
なるほど、WindowsXP以降の複数ユーザー機能の事ですね。
Findwindowはデスクトップセッションをまたいで実行することができないのが原因です。開発されているサービスアプリケーションがシステム権限で動いているのですね。
というわけで、簡易ユーザー切り替えっていう機能が用意されています。
http://support.microsoft.com/kb/310153/ja
http://msdn.microsoft.com/ja-jp/library/cc979400.aspx
と簡単にググった結果ですが、実際私はこれを使ったことはありません。
多分Delphiのサンプルも少ないかと思います。(探してませんが)
うまくいったら結果のフィードバックを頂けると嬉しいです。
monaaさんアドバイスありがとうございます。
少々ニュアンスが違うようですし、多少要求仕様も変わったので、改めて質問を書き直してみます。
Windowsサービスプログラムとして、とある計測機器と通信を行いデータを取得するプログラムを作成しました。この計測機器から受け取ったデータを判定し条件に一致した場合には履歴としてデータベースに情報を順次保存していきます。
計測機器との通信は非常に高速に処理をしなければならないため、条件判定及びデータ保存部分はサービス開始時に起動した別プログラム(タスクトレイ常駐プログラム)に処理させることとしました。
この時サービスプログラムと条件判定プログラムとでプロセス間通信によるデータ(メッセージ)の受け渡しを考えているのですが、ウィンドウを持つプログラムからのメッセージ送信はFindWindowで条件判定プログラムのウィンドウハンドルを取得することにより正しく行えたのですが、サービスプログラムではFindWindowは常に0を返すため利用できず困っていたので最初の質問をさせて頂きました。現時点では複数ユーザー機能とは考えていません。
その後アドバイスをもとに、GetWindowThreadProcessId等を利用しウィンドウハンドルの取得のための調査、テストを繰り返しましたが未だに条件判定プログラムのウィンドウハンドルが特定できずにいます。
プロセス間通信は諦めて、サービスプログラムから判定プログラムを起動して自身が既に起動済みの場合には自身にメッセージを送るという方法に変更しようと思い始めました。残念ですが時間切れのようです。今後も機会があれば調査したいと思っています。
改めて、『それは』さん『monaa』さん、ありがとうございました。
更なる仕様変更につきメッセージ送信の必要がなくなってしまいました。
次回にチャレンジです。
ツイート | ![]() |