procedure TForm1.Timer2Timer(Sender: TObject);
var
 Gameh:HWND; //ub:string;
 shu:string;
begin
  tempa:=gold;
  //tempb:=RzEdit1.text;
  shu:=RzEdit1.Text;
  //ub:=IntToStr(tempa);
  //shu:='700';
  Gameh:=FindWindow(nil,'Caption');
             if  tempa > StrToInt(shu)  then
               begin                 if ctcheck = 0 then
                 begin
                  PostMessage(Gameh,Messages.WM_LBUTTONDOWN,0,$01ca0180);  
                  PostMessage(Gameh,Messages.WM_LBUTTONUP,0,$01ca0180);
                  ctcheck:=1;
                  Sleep(300);
                 end
                 else
                 begin
                  PostMessage(Gameh,Messages.WM_LBUTTONDOWN,0,$024802ae); 
                  PostMessage(Gameh,Messages.WM_LBUTTONUP,0,$024802ae);
                  ctcheck:=0;
                  Sleep(300);
                 end;
               end
             else
             begin
                SendMessage(Gameh,WM_CLOSE,0,0);   //关闭进程;
             end;
end;以上代码运行起来是可以成功完成定时操作.timer2控件时间设的是1000毫秒执行一次.设大了达不到速度要求.有什么办法达到同样的速度,程序运行起来也不卡呢?本人初学编程,请指教,在此谢谢各位达人

解决方案 »

  1.   


    个人感觉发送完按键信息后目标窗体被执行后并没有反馈结果.这个结果没有的话就没有什么中断条件.所以程序本身会不断的发送执行sendmessage这样就造成了卡的问题.关键是找不到什么中断的条件.所以只能定时了
      

  2.   

    你在主线程使用 Sleep(300); SendMessage这些肯定有写卡 
    你把这些操作放到线程去处理
    线程函数
    While not terminte do
    begin
      Sleep(Timer2Timer的时间)
      Timer2Timer的代码
    end;
      

  3.   


    我现在就去试试.我其它的都是放在线程函数里的.只不过添加了一个窗体介面.我的函数DLL是注入在sendmessage目标进程里的.这个对程序运行速度上没影响吧?
      

  4.   

    我把这些放在一个单元里然后调用出错.undeclared identifier:terminte
    我是初学者,请多指教一下.谢谢你的帮助.
      

  5.   

    我说的是 TThread 类的。
    Terminated
      

  6.   

    虽然没实质上帮到我.可也学到了不少东西.谢谢,最好是帮忙提供一下这方面资料网址或是别的什么.我将下面的一些地方加了注解,我想卡的原因跟我将这个DLL函数文件注入到Caption程序里面也有关系吧.再加上用了timer控件就导致了程序卡.换成sanguomi所说的多线程TThread的应该就可以解决了吧.不过还是看不懂.嘿嘿.有待进一步学习呀.所以有分给了,回复的多多少少都有分.谢谢大家的帮助.有资料就别小气提供给我吧.你让我百度我都不知道百啥去.嘿嘿.谢谢啦.====================================================================================
    procedure TForm1.Timer2Timer(Sender: TObject);
    var
     Gameh:HWND; 
     shu:string;
    begin
      tempa:=gold;//这里的GOLD来源函数单元function gold():Integer;的返回值
      shu:=RzEdit1.Text;//这里将输入的值放进变量shu里与进程里的tempa对比值
      Gameh:=FindWindow(nil,'Caption');//查找Caption窗口的句柄
      if tempa > StrToInt(shu) then
      begin  if ctcheck = 0 then        //这里的CTCHECK值由BUTTON事件赋值为0或1  并将timer事件打开.
      begin
      PostMessage(Gameh,Messages.WM_LBUTTONDOWN,0,$01ca0180);   
      PostMessage(Gameh,Messages.WM_LBUTTONUP,0,$01ca0180);
      ctcheck:=1;
      Sleep(300);
      end
      else
      begin
      PostMessage(Gameh,Messages.WM_LBUTTONDOWN,0,$024802ae);  
      PostMessage(Gameh,Messages.WM_LBUTTONUP,0,$024802ae);
      ctcheck:=0;
      Sleep(300);
      end;
      end
      else
      begin
      SendMessage(Gameh,WM_CLOSE,0,0); //关闭进程;
      end;
    end;
      

  7.   

    是不是像下面这组代码的情况?
    =====================
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Edit2: TEdit;
        Button2: TButton;
        Timer1: TTimer;
        Button3: TButton;
        Timer2: TTimer;
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses unit2;{$R *.dfm}var
      hThread:THandle;
      num:Integer;{线程入口函数}
    function MyThreadFun(p: Pointer): Integer; stdcall;
    begin
      while True do {假如线程不挂起, 这个循环将一直循环下去}
      begin
        num := Random(100);
      end;
      Result := 0;
    end;  procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      edit1.text:=inttostr(num);
    end;{建立并挂起线程}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ID:DWORD;
    begin
      hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
    end;{唤醒并继续线程}
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      ResumeThread(hThread);
    end;{挂起线程}
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      SuspendThread(hThread);
    end;procedure TForm1.Timer2Timer(Sender: TObject);
    begin
      edit2.Text:=inttostr(strtoint(edit2.Text)+1);
    end;end.