[BlueLeaf1336]> PROBLEMS> ClickThereItIs!>

ClickThereItIs! - Hack the Open/Save Dialog

historyTOP

2004/01/29:作成
2004/01/30:更新

前ページからの続きTOP

2004/01/29

とりあえずPlatformSDKの「Open and Save As Dialog Boxes」というページ(ms-help:// MS.PSDK.1033/ winui/ winui/ windowsuserinterface/ userinput/ commondialogboxlibrary/ aboutcommondialogboxes/ openandsaveasdialogboxes.htm[適当にちぎってます])で、エディットコントロールの名前を調べたところ、「edt1」であることが分かりました。で既にリンクしたスレッドの中であたりまえのように使っている名前なので、ちょっと試してみるとエラーです。

Delphi6はPersonalなのでソースを持ってませんが、C++Builder5を持ってましてこれはProfessionalでソース付きなのでそれっぽいユニットを捜してみると「dlgs.pas」というのが見つかりました。中を見てみると確かに「edt1」が宣言してあります。ついでに「開く」ボタンは「IDOK」という名前でした。

結局、方針はこんな感じになります。

  1. なんとかしてタゲアログのウィンドウハンドルを得る(今のところCBTフックで半分達成)
  2. 「edt1」のウィンドウハンドルを得る
  3. たとえば「C:\」を「edt1」に書き込む
  4. 「IDOK」のウィンドウハンドルを得る
  5. 「IDOK」ボタンを押す(SendMessage?)

参考になりそうなページ:コモンダイアログのカスタマイズ

いきなり2つ目で躓いてしまいました。今は厳密にはタゲアログだけではなくてダイアログ全般の生成/破棄を監視できている状態ですが、テストとしては十分で、メモ帳を起動して「ファイルを開く」とすれば確かに監視できていることが分かります。この状態でそのダイアログのウィンドウハンドルに対して、

GetDlgItem(そのハンドル,edt1)
とやってるんですが、これが駄目。前述スレッド中のサンプルをみてみるとところどころに
GetParent
が使われているのが気になります。が時間切れ。あとは明日...?にまわします。

タゲアログのみているフォルダを外から変更できましたTOP

2004/01/30

念願のというかまだまだ一部ですが、完全に人の物の「ファイルを開く」ダイアログの表示しているフォルダを変更することができました。試してませんが、「保存する」ダイアログでもいけるはずです。もちろんかなり適当で保険をいっぱいかける必要があるのは間違いないです。それに切り替えの際に一瞬「ファイル名入力エディットボックス」に切り替え先のフォルダ名が見えてしまうのがなぁ。

procedure TMainForm.Button1Click(Sender: TObject);
var
    WH, EditWH, OkWH: HWND;
    Buf: array[0..255] of Char;
    PreText: string;
begin
    if ListBox1.ItemIndex = -1 then Exit;
    //  ダイアログのハンドル取得
    WH := StrToInt(WindowHandleList[ListBox1.ItemIndex]);
    //  Editコントロール検索
    EditWH := GetDlgItem(WH, edt1);
    if (EditWH = 0) then Exit;
    //  今の文字列をバックアップしておく
    FillChar(Buf, SizeOf(Buf), #0);
    SendMessage(EditWH, WM_GETTEXT, SizeOf(Buf), Integer(@Buf));
    PreText := Buf;
    //  書き込む
    SendMessage(EditWH, WM_SETTEXT, 0, Longint(PChar(Edit1.Text)));
    //  OKボタン検索
    OkWH := GetDlgItem(WH, IDOK);
    if (OkWH = 0) then Exit;
    //  OKボタン押す
    SendMessage(OkWH, BM_CLICK, 0, 0);
    //  元に戻す
    SendMessage(EditWH, WM_SETTEXT, 0, Longint(PChar(PreText)));
end;

ただ、ヘコむのはこのコードだと「メモ帳」では失敗するということです。Windows2000でsp4でIE6でWindowsUpdate全て適用が効いているのか、うちのメモ帳は

こんな感じなんですねぇ。「ファイルを保存する」ダイアログが。この左側の良い感じの部分があるのとないのでえらい違いなようで、たとえば「PeggyPad」の

こんなよく見る(よく見た?)ダイアログだと見事に成功します。adrenalineで発見を喜んだFODH - File Open (and SaveAs) Dialog Helperはどうなんでしょうか。気になるところですが、とりあえずココでフォルダの切り替え問題はいったん置きましょう。まだまだすることはあります。

ココまでの整理とココからの整理TOP

2004/01/30

何度か書いたような気がしますが、ここらで「何をどのようにするのか」「どこまでできているのか」を整理しておきます。

ToDoProgressMemo
"Open/SaveAs"ダイアログ(タゲアログ)生成を検知70%ダイアログの生成を無差別に検知
CBTフック
タゲアログが"マウスクリックにより"
非アクティブになったことを検知
10%CBTフック
その時のマウスカーソルの位置にある
エクスプローラのフォルダパスを取得
0%...
タゲアログに送りつける90%終わりかけ
タゲアログをアクティブに戻す0%簡単そう

こんな感じでしょう。進んでるんだかとまってるんだか分かりませんが、このままダラダラページ数を増やしても仕方がないので、それぞれを1ページずつにまとめていこうと思います。で仕上げの1ページで計6ページ...タイガイですが、もはや日記のようなものですので。

EOFTOP