我想在定时器中获得鼠标指向窗口的文本,SendMessage函数的最后一个参数要求是Integer类型,和VC、VB中的都不同,我试了很多种方法,都不成功,请问高手,最后一个参数究竟应该怎样传递?我的代码如下:
procedure Tfrmgetpassword.Timer1Timer(Sender: TObject);
var
   Hwnd :integer;
   Pos :Tpoint;
   PassWord :pchar;  {此处试了很多种类型}
begin
   GetcursorPos(Pos);           {获得鼠标位置} 
   Hwnd:=WindowFromPoint(Pos);  {获得鼠标指向句柄}
   SendMessage(Hwnd,WM_GETTEXT,256,PassWord);  {得到文本,VC和VB中这样都行}
   txtpass.Text :=PassWord; 
end;

解决方案 »

  1.   

    PassWord没有分配内存!
    procedure Tfrmgetpassword.Timer1Timer(Sender: TObject);
    var
       Hwnd :integer;
       Pos :Tpoint;
       PassWord :pchar;  {此处试了很多种类型}
    begin
       GetcursorPos(Pos);           {获得鼠标位置} 
       Hwnd:=WindowFromPoint(Pos);  {获得鼠标指向句柄}
       GetMem(PassWord,256);
       SendMessage(Hwnd,WM_GETTEXT,256,LParam(PassWord));  {得到文本,VC和VB中这样都行}
       txtpass.Text :=PassWord; 
    end;
      

  2.   

    procedure Tfrmgetpassword.Timer1Timer(Sender: TObject);
    var
       Hwnd :integer;
       Pos :Tpoint;
       PassWord :pchar; 
        PasswordLength:integer;
    begin
       GetcursorPos(Pos);           {获得鼠标位置} 
       Hwnd:=WindowFromPoint(Pos);  {获得鼠标指向句柄}
       PasswordLength:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0);{获得Hwnd的文本长度}
       GetMem(Password,PasswordLength);//分配内存
       SendMessage(Hwnd,WM_GETTEXT,PasswordLength,PassWord);  //得到文本
       txtpass.Text :=string(PassWord); //转换为String并付给txtpass.text
       FreeMem(Password,PasswordLength);//释放已分配的内存
    end;
      

  3.   

    谢谢各位指教,请 cuihl 和 Eastunfail(恶鱼杀手) 两位大侠收分
      

  4.   

    都有错误和不完善的地方:1.分配了固定大小的内存,如果超过256怎办?只分配了却没释放!
    2.参数类型是整型数,不能直接用PassWord,这个只是指针,要转化为整型数传递!用强制类型转化,Integer(PassWord)或lParam(PassWord)//因为lParam:Integer,所以可以!释放内存其实也不用指定长度!改下:
    var
       Hwnd :integer;
       Pos :Tpoint;
       PassWord :pchar;
       PasswordLength:integer;
    begin
       GetcursorPos(Pos);
       Hwnd:=WindowFromPoint(Pos);
       PasswordLength:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0);
       GetMem(Password,PasswordLength);
       SendMessage(Hwnd,WM_GETTEXT,PasswordLength,Integer(PassWord));
       Memo1.Text :=string(PassWord);
       FreeMem(Password);
    end;