初めまして。
現在、UltimaOnlineというゲームのサードパーティツールを作成しています。
UOAssistというツールと連動させようとしているのですが、プログラミングを始めたばかりでWindowsメッセージの取得方法をどうすればよいのかわかりません。
内容は
http://www.tugsoft.com/uoassist/thirdpartydev.asp
↑こちらのCount Resourcesで所持しているアイテムのカウントをして、カウントが終了したらResource Count Finishedが送られてくるのですが、その受け取り方が全くわかりません。
種類と個数を取得して、その個数を表示するようにしたいのです。
3日ほど検索しまくって考えていますが解決できません。
どなたかご教授ください。
よろしくお願いいたします。
メッセージがどこに送られてくるかわかりますか?
そこでメッセージを受け取ります。
UltimaOnlineを持っていないため、このツールを起動できなかったのですが、もしかして逆じゃないですか?
このツールに対して「CountResources」メッセージを送り、Get〜メッセージを送ると値が得られるとか。
そうでないなら、「どこに」メッセージが送られてくるかを調べ、その送り先のメッセージをSetWindowLongなどを使って横取りするしかないです。
# スマートなツールであれば、メッセージを送って値を取得、というのが定石です
申し訳ありません。
書き方が悪かったようです。
上記の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 );
}
追記です。
「メインフォームにWM_USER+301が送られてきた時」という条件処理ができれば解決するような感じがします。
なるほど。こちらのウィンドウハンドルを登録して、そこに送ってもらうと。
それならば簡単です。
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.
できました!
にしのさんありがとうございました。
ツイート | ![]() |