你不能通过指针操作窗口,因为那时TForm1类实例的指针,对于其他应用程序你不可能解析类,必须通过窗口句柄来操作窗口,关于如何得到窗口句柄可以搜索以前的帖子!

解决方案 »

  1.   

    使用findwindow得到button1所在窗体form1的句柄,使用EnumChildWindowsProc获得button1的句柄,我在DFW上看见人家写过一段操作QQ发送消息的代码,呵呵,作者自己说有点‘土’,不过看一看无伤大雅:
    unit OicqSendForm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, ExtCtrls;type
      TfrmMain = class(TForm)
        memText: TMemo;
        edtTime: TEdit;
        Label1: TLabel;
        Bevel1: TBevel;
        Label2: TLabel;
        bbtnStart: TBitBtn;
        bbtnEnd: TBitBtn;
        bbtnHelp: TBitBtn;
        Timer: TTimer;
        procedure bbtnStartClick(Sender: TObject);
        procedure bbtnEndClick(Sender: TObject);
        procedure TimerTimer(Sender: TObject);
        procedure bbtnHelpClick(Sender: TObject);
      private
        { Private declarations }
        FTextHandle: HWND;   //qq消息输入框句柄
        FButtonHandle: HWND; //发送按钮输入框
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementation
    //这个函数取当前qq发送窗口上“送讯息”的按钮的句柄
    //function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    var
      buffer: array[0..255] of Char;
      buffer1: array[0..255] of Char;
    begin
      Result := True;
      //得到目标窗口的控件
      GetClassName(hwnd,buffer,256);
      //找到发消息的目标窗口的目标控件
      if StrPas(Buffer)='Button' then
      begin
        GetWindowText(hwnd,buffer1,100);
        if buffer1 = '送讯息(&S)' then
        begin
          PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
          Result:=False;  //终止循环
        end;
      end;
    end;//end of function//这个函数取当前qq发送窗口上消息框句柄
    //function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    var
      buffer: array[0..255] of Char;
      buffer1: array[0..255] of Char;
    begin
      Result := True;
      //得到目标窗口的控件
      GetClassName(hwnd,buffer,256);
      //找到发消息的目标窗口的目标控件
      if StrPas(Buffer)='Edit' then
      begin
        GetWindowText(hwnd,buffer1,100);
        PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
        Result:=False;  //终止循环
      end;
    end;//end of function{$R *.DFM}procedure TfrmMain.bbtnStartClick(Sender: TObject);
    var
      Handle: Integer;
      tmpHandle: Integer;
    begin
      {取句柄}
      Handle := FindWindow(nil,'对话模式');  //就是窗口的Caption
      if Handle<>0 then
      begin
        tmpHandle := Handle;
        //在这里循环取到想要的句柄为止
        //取发送按钮的,FButtonHandle
        EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle));
        FButtonHandle := Handle;    //取消息输入框的,FTextHandle
        EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle));
        FTextHandle := tmpHandle;    Timer.Interval := StrToInt(edtTime.Text);
        Timer.Enabled := true;
      end;//end of ifend;procedure TfrmMain.bbtnEndClick(Sender: TObject);
    begin
      Timer.Enabled := false;//关闭定时器
    end;procedure TfrmMain.TimerTimer(Sender: TObject);
    begin
      {定时发送}
      //设发送文本
      SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text)));  //发送按钮
      //SendMessage(FButtonHandle,BN_CLICKED,0,0);
      SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
      SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);
    end;procedure TfrmMain.bbtnHelpClick(Sender: TObject);
    var
      sHelp: String;
    begin
      //帮助
      sHelp := '打开要发送的对象窗口'+#13+
               '选择对话模式后点[开始]!';
      ShowMessage(sHelp);         end;end.
      

  2.   

    使用 findwindow得到窗体的句柄,使用循环判断的方法得到窗体上某一特定控件的句柄。在DFW上看见过一段代码,作者自己说有点‘土’,呵呵,我觉得还不错呀。看一看也能学到很多东西。
    unit OicqSendForm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, ExtCtrls;type
      TfrmMain = class(TForm)
        memText: TMemo;
        edtTime: TEdit;
        Label1: TLabel;
        Bevel1: TBevel;
        Label2: TLabel;
        bbtnStart: TBitBtn;
        bbtnEnd: TBitBtn;
        bbtnHelp: TBitBtn;
        Timer: TTimer;
        procedure bbtnStartClick(Sender: TObject);
        procedure bbtnEndClick(Sender: TObject);
        procedure TimerTimer(Sender: TObject);
        procedure bbtnHelpClick(Sender: TObject);
      private
        { Private declarations }
        FTextHandle: HWND;   //qq消息输入框句柄
        FButtonHandle: HWND; //发送按钮输入框
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementation
    //这个函数取当前qq发送窗口上“送讯息”的按钮的句柄
    //function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    var
      buffer: array[0..255] of Char;
      buffer1: array[0..255] of Char;
    begin
      Result := True;
      //得到目标窗口的控件
      GetClassName(hwnd,buffer,256);
      //找到发消息的目标窗口的目标控件
      if StrPas(Buffer)='Button' then
      begin
        GetWindowText(hwnd,buffer1,100);
        if buffer1 = '送讯息(&S)' then
        begin
          PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
          Result:=False;  //终止循环
        end;
      end;
    end;//end of function//这个函数取当前qq发送窗口上消息框句柄
    //function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    function GetEditHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
    var
      buffer: array[0..255] of Char;
      buffer1: array[0..255] of Char;
    begin
      Result := True;
      //得到目标窗口的控件
      GetClassName(hwnd,buffer,256);
      //找到发消息的目标窗口的目标控件
      if StrPas(Buffer)='Edit' then
      begin
        GetWindowText(hwnd,buffer1,100);
        PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
        Result:=False;  //终止循环
      end;
    end;//end of function{$R *.DFM}procedure TfrmMain.bbtnStartClick(Sender: TObject);
    var
      Handle: Integer;
      tmpHandle: Integer;
    begin
      {取句柄}
      Handle := FindWindow(nil,'对话模式');  //就是窗口的Caption
      if Handle<>0 then
      begin
        tmpHandle := Handle;
        //在这里循环取到想要的句柄为止
        //取发送按钮的,FButtonHandle
        EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle));
        FButtonHandle := Handle;    //取消息输入框的,FTextHandle
        EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle));
        FTextHandle := tmpHandle;    Timer.Interval := StrToInt(edtTime.Text);
        Timer.Enabled := true;
      end;//end of ifend;procedure TfrmMain.bbtnEndClick(Sender: TObject);
    begin
      Timer.Enabled := false;//关闭定时器
    end;procedure TfrmMain.TimerTimer(Sender: TObject);
    begin
      {定时发送}
      //设发送文本
      SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text)));  //发送按钮
      //SendMessage(FButtonHandle,BN_CLICKED,0,0);
      SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
      SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);
    end;procedure TfrmMain.bbtnHelpClick(Sender: TObject);
    var
      sHelp: String;
    begin
      //帮助
      sHelp := '打开要发送的对象窗口'+#13+
               '选择对话模式后点[开始]!';
      ShowMessage(sHelp);         end;end.
      

  3.   

    OPENDERPROCESSS
    Readmemoeryprocess
    writememoproscessdelphi 帮助下有梨题
      

  4.   

    我顶,如果谁能回答的让我满意我给500分,决不失言!!!!!!!!
    再说一次我要得到的不是句柄,而是 artman 老兄说的TFORM1类的实例的指针.