又来打扰大家了,刚上班问题挺多的,其实都是一个问题引出来了。就是两个程序间发消息的问题。
我听同事说有一种现象是这样的:
一个程序可以给界面上任何一个当前光标所在位置传值。
不知道这是怎么实现的,有人知道吗?
我现在觉得应该也是用的sendmessage,不肯定,所以来问问?
最近分少了,先给50吧

解决方案 »

  1.   

    GetCursorPos  SendMessage  ... 我不太明白你的意思
      

  2.   

    应该是这样的,GetCursorPos取得鼠标所在控件或者窗体的句柄Handle,然后发送消息SendMessage吧,你试试看。
      

  3.   

    vHandle是控件的句柄SendMessage(vHandle,   WM_SETTEXT,   255,   LongInt(PChar('上海市')));   
      

  4.   

    //接收消息程序procedure MyMessage(var msg: TMessage); message WM_MyMessage;
    procedure MyMessage(var msg: TMessage);
    begin
      //分解由SendMessage传来的结构体,一般该结构体是类中的成员变量
    end;//发送消息程序Type
      PMyData=^TMyData
      TMyData=struct
        //成员
      end;
      New(PMyData);
      PMyData.XXX:='';
      SendMessage(XXX,WM_MyMessage,0,Integer(PMyData));
      

  5.   

    GetCursorPos返回值是Boolean型,不能得到句柄啊?
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Edit1: TEdit;
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
    var
      pt : Tpoint;
      vhwnd : Hwnd;
    begin
     if  GetCursorPos(pt) then begin
       vhwnd := WindowFromPoint(pt);
       if vhwnd <> 0  then begin
         SendMessage(vhwnd,WM_SETTEXT,0,longint(pchar('虎滴小猪猪')));
       end;
     end;
    end;end.
      

  7.   

    var
      p:TPoint;
      h : Hwnd;
    begin
      GetCursorPos(p);
      h := WindowFromPoint(p);//取得控件句柄
       if h > 0  then
       begin
         SendMessage(vHandle,  WM_SETTEXT,  255,  LongInt(PChar('上海市')));  
       end;
    end;
      

  8.   

    starluck咋用我的名字啊?哈哈
    我试试你们的方法
      

  9.   

    通過  handle , GetClassName  用這個API去取得類名,然後你匯總下哪些需要改,然後判斷下就行了。
      

  10.   

    我是这样写的。
      if GetCursorPos(pt) then
      begin
        vhwnd := WindowFromPoint(pt);
        if vhwnd > 0 then
        begin
          GetClassName(vhwnd,ps,256);
          if ps = 'TRzEdit' then
            SendMessage(vhwnd,WM_SETTEXT,0,LongInt(PChar('aa')));
        end;  
      end;这个的第一个问题是:
    如果遍历一个窗体上的控件,判断控件的类名,然后发消息。
    第二个问题是:如何不判断是啥控件,只判断所在焦点的位置是否可编辑?我的一个工作牵连出这么多问题,还请大家帮帮忙。
    真是学到不少东西,API知道了好几个
      

  11.   

    其实最开始的思路很简单,就是一个程序向另一个程序传个值,至于这个值放哪,由另一个程序处理。
    (1)我一开始做的用WM_COPYDATA传值,但另一个程序是PB的,写COPYDATASTRUCT好像不好写,总之另一个程序不愿意用这个方法接收值。
    (2)后来我就用WM_SETTEXT,向另一个程序传值,另一个程序不向我发任何消息,例如给我句柄,不给我任何信息,只让我通过当前焦点来传值。
      这样的话,我就要先获得焦点的控件的句柄,GetCursorPos是获得光标的,如果光标移位,焦点不移,找的就不是焦点所在控件句柄。所以不太妥当。
      我昨天查了下用GetForcegroundWindow,这个是得到焦点所在窗体的句柄,而且当焦点在子窗体的某个控件上时,得到的是父窗体的句柄。所以现在的问题就是如果得到当前焦点所在控件的句柄,这样再判断句柄的类型是不是可编辑的,如果是就传值。焦点所在窗体是子窗体的。
    说的简单点就是一个程序向当前焦点所在的可编辑框内写值。
    不知道我说的明白吗?
      

  12.   

    我已经搞定了。在此贴出代码。并谢谢大家。贴完就结贴。
    方法:
    先用GetWindowThreadProcessId得到另一程序的线程ID   
    然后用AttachThreadInput共享焦点   
    现在可以用GetFocus得到有焦点的控件的hWnd了   
    最后别忘了调用AttachThreadInput撤销连接VB的代码例子:放置一Timer(Timer1)、一TextBox(Text1)   
      Timer的Interval设为100就行了   
         
      Private   Declare   Function   AttachThreadInput   Lib   "user32"   (ByVal   idAttach   As   Long,   ByVal   idAttachTo   As   Long,   ByVal   fAttach   As   Long)   As   Long   
      Private   Declare   Function   GetWindowThreadProcessId   Lib   "user32"   (ByVal   hWnd   As   Long,   lpdwProcessId   As   Long)   As   Long   
      Private   Declare   Function   GetForegroundWindow   Lib   "user32"   ()   As   Long   
      Private   Declare   Function   GetFocus   Lib   "user32"   ()   As   Long   
        
      Private   Sub   Timer1_Timer()   
              Dim   hWnd   As   Long   
              Dim   PID   As   Long   
              Dim   TID   As   Long   
              Dim   hWndFocus   As   Long   
                
              hWnd   =   GetForegroundWindow   
              If   hWnd   Then   
                      TID   =   GetWindowThreadProcessId(hWnd,   PID)   
                        
                      AttachThreadInput   App.ThreadID,   TID,   True   
                      hWndFocus   =   GetFocus   
                      AttachThreadInput   App.ThreadID,   TID,   False   
                        
                      Text1.Text   =   hWndFocus   
                        
              End   If   
                
      End   Sub   
    Delphi的代码例子:{此方法研究了好久啊,真不容易啊;
    此方法是一个程序,向包括自己在内的其他应用程序传值的方法。
    传值时,不需要另一个程序写接收函数,不需要另一个程序向此程序发送请求等。}
    procedure TForm1.Button2Click(Sender: TObject);
    var
      cn: array[0..99] of Char;
      s:string;
      HD: HWND;
      T1,T2: DWORD;
    begin
      (*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
      如果焦点所在子窗体中,则获得的是父窗口句柄。*)
      HD := GetForegroundWindow;
      if HD > 0 then
      begin
        //通过焦点所在窗口的句柄,获得其线程的标识符
        T1 := GetWindowThreadProcessId(HD);
        //通过本身的句柄,获得本身的线程的标识符
        T2 := GetWindowThreadProcessId(Application.Handle);
        //共享焦点
        AttachThreadInput(T2,T1,True);
        HD := GetFocus;
        if (HD > 0) then
        begin
          GetClassName(HD,cn,Length(cn));
          if Trim(cn) = 'TRzEdit' then
          begin
            SendMessage(HD,WM_SETTEXT,0,LongInt(PChar('虎滴小猪猪')));
          end;
        end;
        //撤销连接
        AttachThreadInput(T2,T1,False);
      end;
      //HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
    end;
    这样我以后忘了好可以查下,并且给以后用的人能搜到。
    在此结贴了。
    同样感谢以上所有朋友的答案。