Windowsメッセージの取得の仕方は?

解決


Gach  2003-05-19 10:14:42  No: 3554

初めまして。
現在、UltimaOnlineというゲームのサードパーティツールを作成しています。
UOAssistというツールと連動させようとしているのですが、プログラミングを始めたばかりでWindowsメッセージの取得方法をどうすればよいのかわかりません。

内容は
http://www.tugsoft.com/uoassist/thirdpartydev.asp
↑こちらのCount Resourcesで所持しているアイテムのカウントをして、カウントが終了したらResource Count Finishedが送られてくるのですが、その受け取り方が全くわかりません。
種類と個数を取得して、その個数を表示するようにしたいのです。
3日ほど検索しまくって考えていますが解決できません。
どなたかご教授ください。
よろしくお願いいたします。


にしの  2003-05-19 17:21:35  No: 3555

メッセージがどこに送られてくるかわかりますか?
そこでメッセージを受け取ります。

UltimaOnlineを持っていないため、このツールを起動できなかったのですが、もしかして逆じゃないですか?
このツールに対して「CountResources」メッセージを送り、Get〜メッセージを送ると値が得られるとか。

そうでないなら、「どこに」メッセージが送られてくるかを調べ、その送り先のメッセージをSetWindowLongなどを使って横取りするしかないです。
# スマートなツールであれば、メッセージを送って値を取得、というのが定石です


Gach  2003-05-19 17:34:48  No: 3556

申し訳ありません。
書き方が悪かったようです。
上記のURLはUOAssist(以下UOA)というソフトの仕様です。
まず、Request DataをUOAにこちらのメインフォームのハンドルを乗せてSendすると、サードパーティーツールとして認識されます。
その後、CountResourcesを送るとカウントが開始し、開始成功なら1が返ってきます。
そして、カウントが終了すると恐らくメインフォームのハンドルを最初に送ったので、そこへResource Count Finishedが送られてくるのだと思います。
他のサードパーティーツールを確認してみたのですが、UOAはアイテム数に変化があると、その都度Resource Count Finishedを送っているようです。

C++Builderなら分かる方が居るのですが、その方が使っているソースは以下のような感じです。

<ヘッダー内>
public: // ユーザー宣言
    enum{ UOA_Mes301 = WM_USER+301 };
    void __fastcall WM_UOAMes301( TMessage &msg ); // WM_USER+301が来たときの処理関数
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER( UOA_Mes301, TMessage, WM_UOAMes301 )
END_MESSAGE_MAP( TForm )

<プログラムソース内>
void __fastcall TForm1::WM_UOAMes301( TMessage &msg )
{
    AnsiString Tmp;
    RegsName[ 20 ];

    switch ( msg.WParam ){
        default: // ETC
            sprintf( RegsName, "ETC" );
            break;
        case 1: // BloodMoss
            sprintf( RegsName, "BloodMoss" );
            break;
    }
    Tmp.printf( "%s = %d個", RegsName, msg.LParam );
    Memo1->Lines->Add( Tmp );
}


Gach  2003-05-19 18:03:56  No: 3557

追記です。
「メインフォームにWM_USER+301が送られてきた時」という条件処理ができれば解決するような感じがします。


にしの  2003-05-19 18:13:43  No: 3558

なるほど。こちらのウィンドウハンドルを登録して、そこに送ってもらうと。

それならば簡単です。
C++Builderのソースを借りるならば、次のようになります。

unit uform1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  UOA_Mes301=WM_USER+301; // メッセージの定義
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
  protected
    // メッセージを受け取るプロシージャ
    procedure UOAMes301(var msg: TMessage); message UOA_Mes301;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.UOAMes301(var msg: TMessage); 
var
  Tmp: String;

begin
  case msg.WParam of
    1://BloodMoss
    begin
      Tmp := 'BloodMoss = ' + IntToStr(msg.LParam);
    end;
    else
    begin
      Tmp := 'ETC = ' + IntToStr(msg.LParam);
    end;
  end;
  Memo1.Lines.Add(Tmp);
end;

end.


Gach  2003-05-19 23:51:41  No: 3559

できました!
にしのさんありがとうございました。


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

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






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