如何拦截粘贴消息?(100)

A

adibyu

Unregistered / Unconfirmed
GUEST, unregistred user!
我想要拦截在不同进程间复制数据的动作,不知用hook api如何实现?
 
文件的话,就是readfile和writefile了其他的话,你可以看看这个api:SetClipboardViewer
 
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Clipbrd;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public FNextViewerHandle:tHandle; procedure WMDrawClipboard (var message : TMessage); message WM_DRAWCLIPBOARD; { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);beginChangeClipboardChain(Handle, FNextViewerHandle);end;procedure TForm1.WMDrawClipboard (var message : TMessage);beginSendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);Memo1.Lines.Add(Clipboard.AsText);end;procedure TForm1.Button1Click(Sender: TObject);beginFNextViewerHandle := SetClipboardViewer(Handle);end;end.///没用hook 不知道有没有分
 
to zhengrong117不好意思,你的好像是监控剪切板,而我要的是拦截用户的粘贴动作(是指粘贴内容,而不是文件).
 
Windows剪贴板  Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制。Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,用来暂存在各进程间进行交换的数据:提供数据的进程创建一个全局内存块,并将要传送的数据移到或复制到该内存块;接受数据的进程(也可以是提供数据的进程本身)获取此内存块的句柄,并完成对该内存块数据的读取。  为使剪贴板的这种IPC机制更加完善和便于使用,需要解决好如下三个问题:提供数据的进程在结束时Windows系统将删除其创建的全局内存块,而接受数据的进程则希望在其退出后剪贴板中的数据仍然存在,可以继续为其他进程所获取;能方便地管理和传送剪贴板数据句柄;能方便设置和确定剪贴板数据格式。为完善上述功能,Windows提供了存在于USER32.dll中的一组API函数、消息和预定义数据格式等,并通过对这些函数、消息的使用来管理在进程间进行的剪贴板数据交换。  Windows系统为剪贴板提供了一组API函数和多种消息,基本可以满足编程的需要。而且Windows还为剪贴板预定义了多种数据格式。通过这些预定义的格式,可以使接收方正确再现数据提供方放置于剪贴板中的数据内容。  文本剪贴板和位图剪贴板的使用  这两种剪贴板是比较常用的。其中,文本剪贴板是包含具有格式CF_TEXT的字符串的剪贴板,是最经常使用的剪贴板之一。在文本剪贴板中传递的数据是不带任何格式信息的ASCII字符。若要将文本传送到剪贴板,可以先分配一个可移动全局内存块,然后将要复制的文本内容写入到此内存区域。最后调用剪贴板函数将数据放置到剪贴板:注意: 下面代码中: 1、HANDLE hGlobalMemory = GlobalAlloc(GHND, dwLength + 1);分配内存长度必须是dwLength + 1,否则在调用SetClipboardData时会出错;可以通过调用 int i2 = ::GlobalSize(hGlobalMemory );来查看分配的长度。 2、hGlobalMemory不能释放,即不能调用::GlobalFree(hGlobalMemory),因为如果在一个程序中还要粘贴的话就必须不能释放,否则在同一程序中粘贴时获得的指针为NULL,但如果只在别的程序中粘贴则可以释放。 以上两条是在编制HsfBrowserCtl(HOOPS三维浏览控件)时总结出来的。可参看原码中的复制、粘贴部分。  DWORD dwLength = 100; // 要复制的字串长度HANDLE hGlobalMemory = GlobalAlloc(GHND, dwLength + 1); // 分配内存LPBYTE lpGlobalMemory = (LPBYTE)GlobalLock(hGlobalMemory); // 锁定内存for (int i = 0; i 〈 dwLength; i++) // 将"*"复制到全局内存块 *lpGlobalMemory++ = '*'; GlobalUnlock(hGlobalMemory); // 锁定内存块解锁 HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄 ::OpenClipboard(hWnd); // 打开剪贴板 ::EmptyClipboard(); // 清空剪贴板 ::SetClipboardData(CF_TEXT, hGlobalMemory); // 将内存中的数据放置到剪贴板 ::CloseClipboard(); // 关闭剪贴板   这里以OpenClipboard()打开剪贴板,并在调用了EmptyClipboard()后使hWnd指向的窗口成为剪贴板的拥有者,一直持续到CloseClipboard()函数的调用。在此期间,剪贴板为拥有者所独占,其他进程将无法对剪贴板内容进行修改。  从剪贴板获取文本的过程与之类似,首先打开剪贴板并获取剪贴板的数据句柄,如果数据存在就拷贝其数据到程序变量。由于GetClipboardData()获取的数据句柄是属于剪贴板的,因此用户程序必须在调用CloseClipboard()函数之前使用它:  HWND hWnd = GetSafeHwnd(); // 获取安全窗口句柄::OpenClipboard(hWnd); // 打开剪贴板HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);// 获取剪贴板数据句柄DWORD dwLength = GlobalSize(hClipMemory); // 返回指定内存区域的当前大小LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory); // 锁定内存m_sMessage = CString(lpClipMemory); // 保存得到的文本数据GlobalUnlock(hClipMemory); // 内存解锁::CloseClipboard(); // 关闭剪贴板
 
顶部