▼ OK牧場さん
> postmessageで2回(2文字)送信すると2回showmessageがでたので
> 自分の考えてる判別方法だとうまくいきませんでした。
う〜む,そうですか.
目的の動作を実現する方法は,いつくか考えられますが.これはやはりEdit1
のサプクラス化が早いかも知れません.
(1)送る側のアプリ
TForm2でTButtonが一つ(Button1)
//====================================================================
// 文字列を送る側のButton1のクリックイベント
// 受取る側のEdit1は判断しやすいようにID値を1000にしてある
//====================================================================
procedure TForm2.Button1Click(Sender: TObject);
var
hWindow : HWND;
EditHandle : HWND;
GetText : PChar;
SendText : String;
begin
//まず目的のEdit1があるTForm1のウィンドウハンドルを取得
//次にそのウィンドウ内のIDが1000のコントロールのハンドルを取得
//そこにWM_SETTEXTで文字列を送る
//ここでは既に入力済みの文字列を取得しているが
//受取った側で処理する方法も考えられる
hWindow:=FindWindow('TForm1',nil);
if hWindow<>0 then begin
EditHandle:=GetDlgItem(hWindow,1000);
SendMessage(EditHandle,WM_GETTEXT,256,LPARAM(GetText));
SendText:=GetText+'567';
SendMessage(EditHandle,WM_SETTEXT,0,LPARAM(PChar(SendText)));
end;
end;
(2)受取る側のアプリ
TForm1でTEditを一つ配置(Edit1)
var
EditFlag: Boolean;
OriginalProc: Pointer;
//====================================================================
// Edit1のサブクラス化関数
//====================================================================
function Edit1Proc(AWnd: HWND; uMsg: UINT; wParam:WPARAM;
lParam: LPARAM):LRESULT; stdcall;
begin
case uMsg of
WM_SETTEXT:
begin
EditFlag:=False;
//他からEditに文字列が入力された時の処理
end;
WM_KEYDOWN:
begin
EditFlag:=True;
//Edit1にキーボードからタイプした時の処理
//もちろんOnKeyPress,OnKeyDownに書いてもよい
end;
end;
//通常の処理を継続
Result:=CallWindowProc(OriginalProc,AWnd,uMsg,wParam,lParam);
end;
//====================================================================
// 送る側でEdit1を判定しやすい様にID=1000とする
//====================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle,GWL_ID,1000);
//Edit1のサブクラス化
OriginalProc:=Pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC,
LongInt(Addr(Edit1Proc))));
end;
end.
サブクラス化というのは,ここではEdit1に対してですが.
TEditのヘルプを見て下さい.このプロパティにWindowProcというのがあります.
これで,TEditがメッセージを処理する関数を指定しています.この関数の処理
内容を変更する,つまり関数のサブ関数という意味で「サブクラス」といっています.
(または元のEdit1の(とは違う)サブクラスの動作仕様という意味)
(これはコールバック(呼び戻し)関数と言われるものの仲間でもあります)
このサプクラス関数の名前は任意ですが,引数の型と順序は指定されています.
このサブクラス関数の中で,Edit1のメッセージを処理しようというわけです.
詳しい説明は,Halbow資料館などにもありますで,後で調べて下さい.
取敢えず,上記のコードの動作が目的の動作を実現するために利用可能だけを
確認して下さい.
もしかしたら,未知の世界のコードや命令があると思いますが,いつかは
通らなければならない道です.頑張って下さい.
|