怎样使用RegisterClipboardFormat? 300分(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
我推荐这样:
struct
{
......//其他不变的部分
int size;
//buf的长度
}

P:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE,
Sizeof(Struct)+length(memo1.text)+1);
YourStruct.Size:=Length(Memo1.Text);
Move(YourStruct,P^,SizeOf(Struct));
Move(Memo1.Text,Pointer(Interger(P)+SizeOf(Struct))^,Length(Memo1.Text);


接受:
Move(P^,YourStruct,SizeOf(Struct);
Move(Pointer(Integer(P)+SizeOf(Struct))^,YourPChar,YourStruct.Size)


//看看Pipi.的还有什么方法。
 
瞎说几句,在自己的程序间传数据为何不用FileMapping,WM_COPYDATA,
剪贴版是给通用格式用的,其它未知的程序也能使用。
即使自己注册了一个FORMAT,COPY时也会冲掉原来剪贴版上的内容。
如果还想保留原来的内容,就得作成剪贴版查看程序吧,SetClipboardViewer,
同时维护两份。
 
是这样的.
我的程序要提供标准的"复制/粘贴"功能,就是说,我从一个程序内部"复制"出了
我的特殊格式数据,能够在另一个程序里面"粘贴"进来.

这个和sendmessage不是一回事儿!

>>剪贴版是给通用格式用的
不是吧! 自定义格式的程序多着呐! 就是delphi自己还定义剪贴半格式那.
 
》这个和sendmessage不是一回事儿!
没人说啊!
 
WM_COPYDATA不就是sendmessage吗?
 
下面是api AdjustTokenPrivileges用到的结构TOKEN_PRIVILEGES
在windows.pas中的定义方法:

_TOKEN_PRIVILEGES = record
PrivilegeCount: DWORD;
Privileges: array[0..0] of TLUIDAndAttributes;
end;


该结构就是可变长度的,PrivilegeCount指出后面实际跟着的Privileges
有几个TLUIDAndAttributes。
Privileges在这里只先定义了1个(array[0..0])TLUIDAndAttributes数据
实际这个结构后面还可能跟着几个,先定义1个是为了访问的时候方便,
实际存储在内存中的数据和前卫的方法是一样的,但是有了Privileges
这个成员可以更方便的访问这个不定长的array的起点,是为了以后编程
的方便。

说明:实际的实现,我说的和目前前卫说的是一样的,我的在结构里面
多一个只有一个元素的array的目的(比如上面说的Privileges这个东西),
并不是用来分配内存用的,而是为了编程的方便,起的一个相当于标号的作用
(指示这一块内存区的开始)
 
我昨天试验了以下,如果用上面纯SDK的方法,似乎如果连续"复制"2次就会死机.
最后我改用GlobalAlloc和clipboard.GetAsHandle/Setashandlede结合的
方法搞定了.
 
后退
顶部