外部ソフトペイントを塗りつぶすには

解決


よし  2013-09-22 06:00:12  No: 45323

var
  ParentHND: HWND;
  Child_HND: HWND;
begin
  //ペイントのウィンドウハンドルを取得
  ParentHND :=FindWindow('MSPaintApp', nil);
  if ParentHND = 0 then ShowMessage('Error001!');

  //ハンドルを取得し擬似的に押す
  Child_HND:= FindWindowEx(ParentHND, 0, 'AfxFrameOrView42u', nil);
  if Child_HND = 0 then ShowMessage('Error002!');
  Child_HND:= FindWindowEx(Child_HND, 0, 'Afx:1000000:8', nil);
  if Child_HND = 0 then ShowMessage('Error003!');

  if Child_HND <> 0 then
  begin
    SendMessage(Child_HND, WM_LBUTTONDOWN, 100, 100);
    Sleep(500);
    SendMessage(Child_HND, WM_LBUTTONUP, 100, 100);
  end; 

で、塗りつぶす場所を選択していれば、塗りつぶせることはわかったのですが・・・、色を変えたり、メニューをいじったりすると、塗りつぶせません。
ハンドルの対象にフォーカスが当たっていないと、色を濡れない=クリックされないようなのですが、ハンドルの対象にフォーカスを与えるのは、どうしたらできるのでしょうか?

SetFocusでは、エラーになるようです。
さてさて、どうして解決したいいものか?

delphi2010


  2013-09-22 17:00:46  No: 45324

OSの環境や、状況説明をもう少し丁寧にされた方がよろしいと思います。
状況がよく分かりません。

当方の環境は、メニューをいじってもフォーカスは当たったままです。
フォーカスが失われるということがどのようなことか、よく分かりません。
もし失われてしまったとしても、mouse_eventなどで範囲選択処理を行う
ことはできないでしょうか。

もし、単純に特定の範囲の色を矩形に塗りつぶすということなのであれば、
自前のアプリにそのような機能を盛り込んでしまうのも手かと思います。
既にご存じだと思いますが、ペイントは外部からの操作を想定した作り
にはなっていません。画像の表示倍率が違っていたりすれば、誤った画像
処理をしてしまうことにもつながります。


よし  2013-09-22 19:25:38  No: 45325

あ、XPの標準でついてるペイントを、delphiで操作したいのですよ。
塗りつぶしを選んだのは、クリックしたのがわかりやすいため。
「delphiで、電卓のボタンを押す」のペイント版で、ようは習作です。
mouse_eventはマウスが動いてしまうので、却下で。

で、クラスを取得するソフトを使いまして、クラス名は
MSPaintApp
AfxFrameOrView42u
Afx:1000000:8
↑塗りつぶす部分(クリックするの)は、これだと分かり、ハンドルを取得したのです。

で、実際に塗りつぶせた(クリック)できたのですが、それはペイントのドロー部分を触った後。
触ったとなら、ペイントをバックグランドに移動させても動作はする。
が、色を変えると、塗りつぶせない(クリックできない)ようなのです。

で、ドロー部分から、フォーカスが外れているからできなのかなー?と。

とはいえ、”あ”さんの環境ではできているようなので、再度確認してみます。


よし  2013-09-22 20:27:51  No: 45326

あ、馬鹿でした。
凡ミスです。

SendMessage(Child_HND, WM_LBUTTONDOWN, 0, MakeLParam(150,70));

でした。orz


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加