如题:
如何得到copy动作的进程ID,
比如:我在记事本中 copy一些文字,我想得到这个记事本的进程ID
     我在word中 copy一些文字,我想得到这个word的进程ID

解决方案 »

  1.   

    我知到是用hook api  但是,是hook 到哪一个api呢!
    以下是常用的对剪贴板操作的api 可是,没有一个能和进程相关的(一)ChangeClipboardChain  将剪贴的连接从一个句柄转到下一个句柄。 
    (二)CloseClipboard 关闭剪贴板。 
    (三)CountClipboardFormats 
    (四)EmptyClipboard 
    (五)EnumClipboardFormats 
    (六)GetClipboardData 
    (七)GetClipboardFormatName 
    (八)GetClipboardOwner 
    (九)GetClipboardSequenceNumber 
    (十)GetClipboardViewer 
    (十一)GetOpenClipboardWindow 
    (十二)GetPriorityClipboardFormat 
    (十三)IsClipboardFormatAvailable 
    (十四)OpenClipboard 
    (十五)RegisterClipboardFormat 
      

  2.   

    http://topic.csdn.net/t/20041121/15/3573625.html
      

  3.   

    http://msdn2.microsoft.com/en-us/library/ms648709.aspx
      

  4.   

    可能下 WH_GETMESSAGE钩子,再拦截WM_COPY可以实现。
    但现在很多程序都钩不住了。如果可靠性要求比较高的话,还是写个驱动吧。
      

  5.   

    对不起,可能还要加上WH_MSGFILTER
    spy++就是用这样时间的。
      

  6.   

     下 WH_GETMESSAGE钩子 ,WH_MSGFILTER  好像没有效果!
      

  7.   

    spy++ 是下了WH_MSGFILTER  钩子的,我没有具体分析。
      

  8.   

    GetClipboardOwner可以获得剪贴板来源的窗体句柄,通过窗体句柄可以到的其所在进程
    参考如下代码:
    uses PsAPI;procedure TForm1.Button1Click(Sender: TObject);
    var
      vOwner: THandle;
      vProcessId: THandle;
      vProcess: THandle;
      vBuffer: array[0..255] of Char;
    begin
      vOwner := GetClipboardOwner();
      if vOwner = 0 then Exit;
      GetWindowThreadProcessId(vOwner, vProcessId);
      vProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        False, vProcessId);
      GetModuleFileNameEx(vProcess, 0, vBuffer, SizeOf(vBuffer));
      Caption := vBuffer;
    end;