这个问题有点难度, 各位请进.(100分)

  • 主题发起人 主题发起人 Richling1975
  • 开始时间 开始时间
R

Richling1975

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
我是一个DELPHI的生手, 请各位帮个忙.
在用NOTE做文件仓库时因为BOSS要求文件只只能让用户查看,不能打印和
存副本在HARDDISK上,所以我使用OLEContainer写了一个OCX, 用于显示WORD,
EXCEL 等文件. 这个控件可以屏弊SAVE, SAVE AS , PRINT , 但是不能限制
用户COPY, 用户可以先在我的控件中SELECT -> COPY , 然后另开一个WORD文
件, 将之PASTE出去.
我想了一个办法, 就是当用户离开我的程序时清空剪贴板, 我的程序如下:

procedure TOLEContainerX.ActiveFormCreate(Sender: TObject);
begin
//设APPLICATION的OnDeactivate事件
Application.OnDeactivate := AppDeactivate;
end;

procedure TOLEContainerX.AppDeactivate(Sender: TObject);
begin
//调用WIN API 清除CLIPBOARD
//打开
OpenClipboard(OleContainer1.Handle);
//清除
EmptyClipboard ;
//关闭
CloseClipboard();
end;

当我做成一个EXE文件时, 这个方法是OK的 , 但是当我做成OCX然后EMBED到
NOTES的FORM中时, APPLICATION.ONDEACTIVATE事件就不被调用了, 请问各位GGJJ
们, 我该如何做才能实现此功能.
如果有其它的思路也请不吝赐教. 拜托!拜托!
还有, 请问那里弄可以DOWN到李维的Delphi5.XADO_MTS_COM+高级程序设计篇?
我找了N天了,只DOWN到前四章.

在线等待中..........
 
真的很难吗? 没有一个高手可以答一下?
 
捕捉click事件和key事件的键,ctrl+c和鼠标右键
 
在WORD和EXCEL中"捕捉click事件和key事件的键,ctrl+c和鼠标右键"? 好像在DELPHI中
做不到, 而且我不能保证只有这两种文件.

hikehilter, THANKS ! 你还有没有其它建议 ?
 
在自己的ocx控件中重载keydown过程屏蔽ctrl+c就可以了。
如:
procedure MyOCX.keydown(var Key: Word; Shift: TShiftState)
begin
...
case key of
67: // 'c'
if ssCtrl in Shift then
key := 0;
....
end;
...
inherited;
end
 
MikeZ :
不可以这样做, 因为OLECONTONER打开了WORD文件之后, 控制权限已经转移给WORD, 这时候
MYOCS.KEYDOWN是不起作用的. 我已作过测试, 不知你还有没有其它方法?

谢谢你的回复!
Richling1975
 
to Richling1975:
不好意思,使我弄错了!先前说的办法是不管用,我后来又试了另一种方法。
你的要求使用户之可以察看,不可以去走。这样的话,到可以用文件保护的方法,把所有文档都设唯有保护的状态,word可以做到所有的操作都禁止,excel还没有是成功。这个思路你不妨用一下。
 
to Richling1975:
我找到一个比较本的方法:在OLECONTONER下面加一个panel之类的空间,写panel的onmousemove事件来清CLIPBOARD
panel比OLECONTONER少大。一般说,copy到另外的程序中,会用鼠标去点击,这样panel的onmousemove事件就能被触发。
希望这能有帮助。
 
MIKEZ :
你的方法可以解决一部分问题, 但是如果用户用KEYBOARD的话, 还是会有漏网之鱼.
至于设为PROTECT STATUS, 因为我不能保证只有OFFICE文档, 而且就光是OFFICE文档都
有六七种, 所以我早就不考虑了.
不管怎样, 我会给你过分的,因为你的回答让我改变了对这BBS的感觉
希望继承得到各位的帮助,给小弟一些建议, 因为我已在BOSS面前夸了口,如果搞不定,
可能到时就要......... 好惨啊!

BEST REGARDS
 
DON'T CRY RICHLING1975:
再不济我们用定时器的办法,只要OLECONTONER一激活,定时器就开启,随时清理CLIPBOARD
OLE OBJECTS要直接控制恐怕比较难,还是要想本身程序能够控制的办法。
你的第一个方法我想可以再试试,做成ocx当然不会有APPLICATION.ONDEACTIVATE了,
但note中是否有这样的事件我不太熟,delphi的办法我再想。

不知你的年龄,就叫你小弟吧,不会错的(因为我已经很老了),我热爱软件,更愿意与同志这交流。
希望以后还能联系:
mike6912@sina.com
 
MikeZ :
我现在就已逼不得已用了TIMER控件,可谓大丈夫所见略同.
我的方法是先记住控件所在WINDOWS的HANDLE,然后每隔一秒钟检验一下ACTIVE WINDOW的HANDLE
如果不同就清一次CLIPBOARD.
这样做有两个BUG:
1.TIMER控件启动后其它的程序的剪贴版也受影响;
2.如果用户不切换APPLICATION, 直接在NOTES中新开一个MAIL,这样TIMER就清不到CLIPBOARED了
我只好采用你的PANEL的MOUSEOVER事件了,希望我的BOSS不会聪明到用KEYBOARD来创建MAIL...
阿门!
另外, 劝告各位一句, 千万别学NOTES,不然你会给气死, 这个工具简直是程序员的噩梦....
什么功能都没有.连一个MODAL窗口的功能都没有, 不然我也不会这么狼狈了

希望大家还能给出一些修改改意见,让小弟能完善这个东东,



 
敲了半天突然发不出去,到

建议如下:
用HWND GetClipboardOwner(VOID)得到Copy的窗口,
最难在于找到Ole Object的HWND。
你自己试试,这样清除CLIPBOARED就不会乱来了!
用Memo我是成了。

有点信心!

 

Similar threads

D
回复
0
查看
744
DelphiTeacher的专栏
D
D
回复
0
查看
749
DelphiTeacher的专栏
D
D
回复
0
查看
764
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部