サービスから起動しているとEnumWindowが期待通り動かないですよ

68 :デフォルトの名無しさん:2007/09/10(月) 22:56:40
EnumWindowで質問があります。ム板で追い出されてしまいました...
諸先輩方よろしくお願いします。

○やりたいこと
PHP+Cで、PHPから外部exeを起動して任意のWindowのPrintScreen取得。
 外部exeは常駐ではなく、PHPで指定されたときのみ実行。

○質問 :
?PHPからEnumWindowを使用した外部exeを起動すると、外部exe内のEnumWindowが期待通りに動かず、
 意味のわからないハンドルを取得してしまいます。
 ソースが学校のためうろ覚えですが、取得ハンドルのタイトルを見る限り、"Zend Timeout Window"とか"SENS"とか、
 "○○WindowSocket?"のようなものが5つくらい取得されていて、Windowsアプリのハンドルは取れませんでした。
 これは何でしょうか?回避方法を教えてください。
?PHPで任意のWindow画面の画像キャプチャする方法があれば、ヒントを教えて下さい。

○プログラム内容 :
・Cプログラム
コンソールからWindow画像を取得するexeを作成しました。
起動時にWindowタイトルの一部を入力すると、その画像を取得します。不一致はデスクトップ画面を取得します。
EnumWindowでハンドル取得 -> Bmp作成 -> BitBlt -> ファイル保存の流れです。
コンソールからは正しく動作しています。

PHPプログラム
 簡単な入力Formのみ。ボタンを押すと上記exeをsystem命令で起動しています。

○環境
 ・Windows 2000, Pen4 2G, MEM 512M
 ・Apache2.2.4, PHP 5.2.4 + zend debugger, VC6, eclipse + PDT


75 :デフォルトの名無しさん:2007/09/10(月) 23:16:57
>>68
Apacheがサービスとして動いているなら、
EnumWindowがうまく動いていないように見えるのは、
デスクトップが異なっているため。
ウィンドウステーションとかでググれば色々わかると思う。

サービスのプロパティで、
「デスクトップとの対話をサービスに許可」にチェックを入れれば、
そのプログラムはお前が思っていたとおりに動くようになるかもしれない。
ただし、セキュリティ上の問題があるかもしれないので、慎重にやれ。


76 :デフォルトの名無しさん:2007/09/10(月) 23:20:03
一応API関係なんじゃないの
PHPがサービスとして起動していて目的の窓と別セッションになっているとか


78 :68:2007/09/10(月) 23:49:22
>>76
どうもです。仰るとおりサービスで起動しているため、ユーザーのデスクトップが取れていなかったみたいです。
ネット調べてたらGetProcessWindowStation命令で行けそうな感じです。
ありがとうございました。参考リンクはっときます。

ttp://forums.belution.com/ja/vc/000/401/43.shtml
ttp://support.microsoft.com/default.aspx?scid=kb;ja;173687

Win32API質問箱 Build57

手っ取り早く、>>75さんの言うとおりサービスのプロパティで「デスクトップとの対話をサービスに許可」にチェックを入れると期待通り動作しました。セキュリティには十分注意。>>78が貼ってるMSのサイトでも言われてます。

注意: LocalSystem アカウントで、デスクトップと対話可能なサービスを実行するのは、とても危険なやり方です。特に、コマンドプロセッサとバッチファイルの場合 CTRL+C で中断するとインタラクティブに操作可能なシステムのコマンドプロンプトをユーザは手にすることができてしまいます。