別のプログラムのファイルを開くダイアログ操作

[戻る]
k2 2009/08/25(火) 11:50:57
今回、下記の目的でプログラムを実装しています。

目的
 別のプログラムでの処理を自動操作にしたい。
 別のプログラムの処理はファイル操作のためファイルの指定が必要である。
 このため、ファイルを開くダイアログが起動したところで、ファイルをフルパス
 指定し、ダイアログを終了させたい。


現在、keybd_eventでキー入力を送ってファイル名していますが、半角のみであれば
対応可能なのですが、全角の場合には漢字変換の都合、対応が難しいので、入力欄
に直接文字列を設定したいのですが、子ウィンドウを列挙してもそれらしきコントロ
ールがなく、列挙したコントロールに対してSetWindowTextで処理を行っても設定さ
れず、GetWindowTextで処理しても入力されているはずの文字列が取得できません。


解決手段をご存知の方いらっしゃいましたら、ご教授お願いします。

開発環境 :VS2005 SP2
開発OS   :XP
動作対象OS:2000,XP

PATIO 2009/08/25(火) 13:16:02
別のプログラムと言うのが自作のアプリで改造が可能であるなら
コマンドラインでファイル指定が出来てファイル指定がされていたら
自動実行するような作りにした方が手っ取り早いし、
スマートな気がしますが、そういう方法は駄目なんでしょうか?

あと、別のプログラムと言うのは特定のプログラムのみで良いのか
一般的なプログラム全般を指しているのかも難易度に関係有りそうです。
プログラム全般を対象にしているならファイルを開くダイアログが
標準の物ではなく、自作のダイアログである可能性ありえますから
定型の処理ではうまく行かない可能性も有ります。

なので、コントロールされる側のプログラムに関してももう少し説明が
必要だとおもいます。自作なのか他作なのか、変更可能なのか不可なのか
条件によっても手段の選択肢が変わりそうです。

k2 2009/08/25(火) 13:39:17
PATIOさん、返答ありがとございます。

今回、対応をしたいのは、GetOpenFileName API呼び出しで表示される
一般的な【ファイルを開くダイアログ】です。

また対象となるソフトウェアは販売されているものを使用しています。

簡単な処理の流れを書きますと

1.ファイルを開く操作を開始 
2.ファイルを選択 
3.実行ボタンを押す
4.処理完了待ち

対象は、ShellExecuteで呼び出し時にファイル名を渡す事もできませんので、
1,2の手順が必要となっています。

仲澤@失業者 2009/08/25(火) 16:11:55
クリップボード経由でファイル名をペーストさせる
って方法も考えられます。

1.まず、当該のファイル名をクリップボードにセットする
2.GetGUIThreadInfo()でフォアグラウンドスレッドの情報を得て、
3.GUITHREADINFO::hwndFocusに対してWM_PASTEをSendMessage()すれば、

いけるかもしれません。試していませんけど・・・(^^;)。

k2 2009/08/25(火) 18:42:54
[[解決]]
仲澤@失業者さん、返答ありがとうございます。

SendMessageによるWM_PASTEですが、ダイアログ呼び出し側ウィンドウ、
ダイアログ、ダイアログ内ウィンドウ(コントロール)に送信しても動作しません
でした。

ですが、クリップボード経由のコピー&ペーストは以下の手順で可能でしたので
抜粋コードを

void pasteText()
{
   //ファイルを開くダイアログをアクティブにする
   SetActiveWindow(hOpenFileDlg); 
   //SLEEPがないと切り替わりが終了しないので、切り替わり待ち
   Sleep(100);

   //キーコード送信
   keybd_event(VK_CONTROL,0,0,NULL);
   Sleep(50);  // ←SLEEPは必要ないかもしれませんが検証していません
   keybd_event(0x56 /*V*/,0,0,NULL);
   Sleep(50);
   keybd_event(0x56 /*V*/,0,2,NULL);
   Sleep(50);
   keybd_event(VK_CONTROL,0,2,NULL);
}

今回の案件に対してはこの処理方法で、解決とさせていただきます。

仲澤@失業者 2009/08/25(火) 19:06:06
ありゃ。エディットぢゃ無かったようですね。
あと、Sleepは「必要」です。

古いスレッドには追加発言できません。