SendMessage操作另一个EXE,存在这,以后也许用得着。

 

unit  Unit1;

interface

uses
 Windows, SysUtils, Classes, Controls, Forms, StdCtrls, IdTCPServer, IdContext,
  IdAntiFreeze, IdAntiFreezeBase, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdGlobal, Messages, Dialogs;

type
  TfrmMain 
=   class (TForm)
    grp4: TGroupBox;
    mmoLog: TMemo;
    IdTCPServer1: TIdTCPServer;
    IdAntiFreeze1: TIdAntiFreeze;
    
procedure  IdTCPServer1Execute(AContext: TIdContext);
    
procedure  FormCreate(Sender: TObject);
  
private
  
public
    
{  Public declarations  }
  
end ;

var
  frmMain: TfrmMain;
  cnt : Integer 
=   0 ;
  UserNameHandle, UserPassHandle, NewAccountHandle, ResultMemoHandle: Cardinal;

  
function  EnumWindowsProc(Hwnd:THandle;lParam:LParam):boolean;Stdcall;
  
function  EnumChildProc(Hwnd:THandle;lParam:LParam):boolean;Stdcall;

implementation

{ $R *.dfm }

uses
  Unit_Msg;

function  EnumWindowsProc(Hwnd:THandle;lParam:LParam):boolean;
var
  WindowCaption:
array [ 0 .. 254 of  Char;
begin
  GetWindowText(Hwnd,WindowCaption,
255 );
  
if  StrPas(WindowCaption)  =   ' CH_Ts2_RELAY MALA NET '   then
  
begin
    cnt :
=   0 ;
    EnumChildWindows(Hwnd,@EnumChildProc,
0 );
    Result :
=  False;
    Exit;
  
end ;
  Result :
=  True;
end ;

function  EnumChildProc(Hwnd:THandle;lParam:LParam):boolean;
var
  WindowClass:
array [ 0 .. 254 of  Char;
begin
  GetClassName(Hwnd,WindowClass,
255 );
  
begin
    Inc(cnt);
    
case  cnt  of
      
25 : UserPassHandle : =  Hwnd;
      
26 : UserNameHandle : =  Hwnd;
      
20 : NewAccountHandle : =  Hwnd;
      
34 : ResultMemoHandle : =  Hwnd;    // 第一个memo   33 是第二个memo
      
21 : ;
    
end ;  
    
// 以下这句代码编号所有子控件,可按EDIT选
    
// if  Pos( ' EDIT ' ,UpperCase(StrPas(WindowClass)))  >   0   then
    
// SendMessage(Hwnd,WM_SETTEXT, 0 ,LongInt(PChar(IntToStr(cnt))));
  
end ;
  Result :
=  True;
end ;

procedure  TfrmMain.IdTCPServer1Execute(AContext: TIdContext);
var
  GameName, Pass: 
string ;
  arr: 
array [ 0 .. 254 of  Char;
  cmdHead: 
string ;
  ReturnMsg: TReturnMsg;
  Buff: TIdBytes;
  AddUser: T_AddUser; 
// add user
begin
  cmdHead :
=  AContext.Connection.IOHandler.ReadLn;
  
// 注册帐号
  
if   ' AddUser '   =  cmdHead  then   begin
    AContext.Connection.IOHandler.ReadBytes(Buff, SizeOf(AddUser));
    BytesToRaw(Buff, AddUser, SizeOf(AddUser));
    GameName :
=  AddUser.uGameName;
    Pass :
=  AddUser.uPass;
    
// 发送模拟信息
    SendMessage(UserNameHandle, WM_SETTEXT, 
0 , Integer(PChar(GameName)));
    SendMessage(UserPassHandle, WM_SETTEXT, 
0 , Integer(PChar(Pass)));
    SendMessage(NewAccountHandle, BM_CLICK, 
0 0 );
    Sleep(
1000 );
    
// 获取memo内容
    SendMessage(ResultMemoHandle,WM_GETTEXT,
255 ,Longint(@arr[ 0 ]));
    SendMessage(ResultMemoHandle, WM_SETTEXT, 
0 , Integer(PChar( '' )));
    
// 比较是否成功
    
if  Pos( ' 101 + 1 RESULT: 1  GNAME:  '   +  GameName, arr)  >   0   then   begin
      ReturnMsg.Tag :
=  SM_AddNewId_Fail;
      ReturnMsg.str :
=  Format( ' %s 帐号已存在! ' , [GameName]);
      Buff :
=  RawToBytes(ReturnMsg, SizeOf(ReturnMsg));
      AContext.Connection.IOHandler.Write(Buff);
      Exit;
    
end   else   if  Pos( ' 101 + 1 RESULT: 0  GNAME:  '   +  GameName, arr)  >   0   then   begin
      ReturnMsg.Tag :
=  SM_AddNewId_Success;
      ReturnMsg.str :
=  Format( ' %s 注册成功! ' , [GameName]);
      MmoLog.Lines.Add(Format(
' %s%s 注册成功!来自IP: %s ' , [GetNowTime, GameName, AContext.Connection.Socket.Binding.PeerIP]));
      Buff :
=  RawToBytes(ReturnMsg, SizeOf(ReturnMsg));
      AContext.Connection.IOHandler.Write(Buff);
      Exit;
    
end   else   begin
      ReturnMsg.Tag :
=  SM_AddNewId_Fail;
      ReturnMsg.str :
=   ' 未知错误! ' ;
      Buff :
=  RawToBytes(ReturnMsg, SizeOf(ReturnMsg));
      AContext.Connection.IOHandler.Write(Buff);
      Exit;
    
end ;
  
end ;
end ;

procedure  TfrmMain.FormCreate(Sender: TObject);
var
  HndForm: THandle;
begin
  HndForm :
=  FindWindow( nil , PChar( ' CH_Ts2_RELAY MALA NET ' ));
  
if  HndForm  =   0   then   begin
    ShowMessage(
' Relay.exe未启动,程序将退出。 ' );
    Application.Terminate;
  
end   else   begin
    
// 先获取句柄
    Enumwindows(@EnumWindowsProc,
0 );
    
if  (UserNameHandle  =   0 or  (UserPassHandle  =   0 or  (ResultMemoHandle  =   0 then   begin
      ShowMessage(
' Handle获取失败,程序将退出。 ' );
    Application.Terminate;
    
end ;
  
end ;

  
try
    
// listen
    IdTCPServer1.Bindings.Add.IP :
=   ' 0.0.0.0 ' ;
    IdTCPServer1.Bindings.Add.Port :
=   8897 ;
    IdTCPServer1.Active :
=  True;
    mmoLog.Lines.Add(Format(
' %s封包注册服务已启动。 ' , [GetNowTime]));
    mmoLog.Lines.Add(Format(
' %s正在监听 %d 端口 ' , [GetNowTime,  8897 ]));
  
except
    MmoLog.Lines.Add(Format(
' %s无法打开 %d 端口,请检查端口是否正在使用中。 ' , [GetNowTime,  8897 ]));
    Exit;
  
end ;
end ;

end .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值