プロが教えるわが家の防犯対策術!

Delphiで他のアプリを操作するためのプログラムを書いています。
他のアプリのウィンドウハンドルを取得するために次のようなプログラムを作ったのですが、(この場合は)メモ帳を立ち上げたままで、何度もウィンドウハンドルを調べてみると時々変わります。
いくつかの値を順番に替わっているような...
どこか間違っていますか?
//------------
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Menus;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
ListBox2: TListBox;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private 宣言 }
public
{ Public 宣言 }
end;
function CallBackTest(hWindow: HWND; LP: LParam): Boolean stdcall;
var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
i :Integer;
begin
EnumWindows(@CallBackTest, 0);
for i:= 0 to form1.ListBox1.Count - 1 do begin
if AnsiPos(Edit1.Text,form1.ListBox1.Items[i]) = 1 then begin
ShowMessage(form1.ListBox1.Items[i] + #10#13 + form1.ListBox2.Items[i]);
end;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.ListBox1.Clear;
end;

function CallBackTest(hWindow: HWND; LP: LParam): Boolean stdcall;
var
PC :PChar;
Len :integer;
Name :string;
begin
Result :=false;
if hWindow <> 0 then begin
GetMem(PC, 100);
Len :=GetWindowtext(hWindow, PC, 100);
setstring(Name, PC, Len);
if Name <> '' then
form1.ListBox1.Items.Add(Name);
form1.ListBox2.Items.Add(IntToStr(hWindow));
Result :=true;
end;
end;

end.
//----------------
//Edit1に「無題」と入力してメモ帳のウィンドウハンドルを調べています。
Delphi XE5 Starter、Win8.1を使っています。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。

    >...それらのサンプル,プログラムは正常に動作しないことになってしまうかも知れません.
    >このことについては,どう思われますか ?
    Notepadとか電卓にキー入力を送るというサンプルを見たのですが、両方とも私のPCには入っていないんです。そのプログラムの動作を確認し、改良していくことができません。
    それで、他のサンプルプログラムを改良してウィンドウハンドル?を調べて、動作させようとしたのですが、行き詰ってます。
    いま、XPパソコンを起動したら、電卓のソフトは入っているので、これで動作を確認してみます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/06/17 08:29
  • つらい・・・

    丁寧に解説していただきありがとうございます。
    実は、あるソフトのplug-inソフトを開発しようとしています。
    (今後の生活が懸かっていますので詳細は書けませんが)

    このソフトで、つぎのことをしようとしています。
    1.ユーザーが登録したソフトの実行
    (起動していなければ、起動。起動していれば最大化またはフォアグランドにする)
    まだまだ調べている途中ですが、ShellExecuteだと無理みたいで、CreateProcessだとOKかも。

    2.本体ソフトの操作
    PostMessageとかSendMessageとかでウィンドウハンドルを扱う必要がある。
    そのための前段階として、簡単なアプリでどうすれば操作できるか確認する。

    (続きます)

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/06/17 16:08
  • つらい・・・

    (続きです)
    Windows APIの本を3冊、Visual Studioの本2冊、C#の本2冊(最終的にC#で動かす必要がありますので)を入手して調べているのですが、なかなか難しいです。

    >FBtnHandle := Button2.Handle;
    同じソフトだと、こんなに簡単にハンドルが取得できるのですね。

    ある程度まで開発出来たら、そのソフトメーカーに相談してみようと思っています。
    お時間をとっていただき本当にありがとうございます。

      補足日時:2015/06/17 16:11
  • へこむわー

    回答ありがとうございます。
    とりあえず、やっとコードの間違いに気づきました。
    いつもはかならずbegin~endで囲むようにしているんですが、なぜか今回は忘れていました。

    (疲れたので、一休み)

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/06/19 10:38

A 回答 (3件)

>ウィンドウハンドルって途中で変わるものなんですか?



もし,ウィンドウハンドルが途中で変わるものとします.
他のアプリを操作するためのプログラムを書いているということですので,参考書やネット上には,ウィンドウハンドルを使用した多くのサンプルやプログラムがあるのはご存じだと思います.
すると,それらのサンプル,プログラムは正常に動作しないことになってしまうかも知れません.
このことについては,どう思われますか ?

>どこか間違っていますか?

上記のことをどう思われるかによって確認してみてはいかがでしょうか.
この回答への補足あり
    • good
    • 0

この「教えて! goo」に書くのは難しそうなので,以下に記事を書いてみました.


参考にしてください.
http://mrxray.on.coocan.jp/Delphi/Others/011.htm
この回答への補足あり
    • good
    • 0

ちなみに,最初に提示されたコードは,必ずしも,メモ帳のハンドルを取得しているわけではありません.


以下を参考にしてください.
http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_ …

ではお仕事頑張ってください.健闘をお祈りしています.
この回答への補足あり
    • good
    • 0
この回答へのお礼

助かりました

ありがとうございます。
何とか「メモ帳」のウィンドウハンドルを取得して操作できるようになりました。
とりあえず、これでこのトピを閉めさせていただきます。

お礼日時:2015/06/20 16:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!