如题。达人呢?

解决方案 »

  1.   

    给你参考一下我的一个程序的一个函数,挑你要用的。
    procedure TfrmMain.OnAttachedTailer(var Msg: TMessage);
    var
      hLastWin, hButton: THandle;
      szWindowText: array[0..MAX_PATH] of Char;
      szTextLength: Integer;
      sTailer, sQQName: string;
      DataObject: TDataObject;
    begin
      if not bRunState then Exit; // 如果是暂停  hLastWin := GetForegroundWindow;
      GetClassName(hLastWin, szWindowText, SizeOf(szWindowText));
      if szWindowText <> '#32770' then Exit;
      szTextLength := SendMessage(hLastWin, WM_GETTEXT, MAX_PATH, Integer(@szWindowText[0]));
      szWindowText[szTextLength] := #0;
      if (Pos('聊天中', szWindowText) > 0) or (Pos('群', szWindowText) > 0) then
      begin
        sQQName := Copy(szWindowText, Pos(' ', szWindowText) + 1, Pos('聊天中', szWindowText) - Pos(' ', szWindowText) - 2);
        hLastWin := FindWindowEx(hLastWin, THandle(nil), '#32770', nil);
        if hLastWin = 0 then Exit;
        hButton := FindWindowEx(hLastWin, THandle(nil), nil, '发送(&S)');
        //if hButton = 0 then Exit;
        //hLastWin := FindWindowEx(hLastWin, THandle(nil), 'AfxWnd42', nil);
        if hLastWin = 0 then Exit;
        hLastWin := FindWindowEx(hLastWin, THandle(nil), 'RICHEDIT', nil);
        if hLastWin = 0 then Exit;
        // 获取数据长度
        //szTextLength := SendMessage(hLastWin, WM_GETTEXT, MAX_PATH, Integer(@szWindowText[0]));
        //if szTextLength <= 0 then Exit;    // 获取数据
        DataObject := GetCurrentDataByName(sQQName, GetGroupByName(sQQName), reSendText);
        if DataObject <> nil then
        begin
          sTailer := DataObject.TextObject.sSendText;
          if Trim(cbLine.Text) <> '' then
            sTailer := string(#10) + Trim(cbLine.Text) + string(#10) + sTailer // 加一回车换行
          else
            sTailer := string(#10) + sTailer; // 加一回车换行
        end;    // 发送数据
        //SendMessage(hLastWin, EM_REPLACESEL, 180, Integer(PChar(sTailer)));
        Clipboard.AsText := sTailer;
        KEYBD_EVENT(VK_CONTROL, 0, 0, 0);
        KEYBD_EVENT(Ord('V'), 0, 0, 0);
        KEYBD_EVENT(Ord('V'), 0, KEYEVENTF_KEYUP, 0);
        KEYBD_EVENT(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
        PostMessage(handle, WM_CLICKSENDBOTTON, WParam(DataObject), LParam(hButton));
      end;
    end;procedure TfrmMain.OnClickSendBotton(var Msg: TMessage);
    var
      DataObject: TDataObject;
      hButton: THandle;
    begin
      DataObject := TDataObject(Msg.WParam);
      hButton := Integer(Msg.LParam);
      //Sleep(200);
      PostMessage(hButton, WM_LBUTTONDOWN, 0, 0); // 现在不用
      PostMessage(hButton, WM_LBUTTONUP, 0, 0);  // 更新数据
      PostMessage(handle, WM_UPDATECURRENTDATA, WParam(DataObject), 0);end;
      

  2.   

    TDataObject;
    是不是 d7才有的啊~ 我d5 没
      

  3.   

    TDataObject是自己写的一个类,跟你没关系,可以删除。
      

  4.   

    谢谢~~ 有没有什么好办法可以检控windows窗口的产生?用 findwindow(ex) 这样好象效率不高哦