档案系统中的问题,在webbrowse中如何预览word,excel文档,屏蔽保存,老问题了,没人可以解决吗? (100分)

  • 主题发起人 主题发起人 pal2003
  • 开始时间 开始时间
我在网上找了很长时间,也没有找到办法。
用钩子处理只屏蔽了键盘,右键,但屏蔽左键时总是出错.
有没有更好的解决办法?
 
把他disable ^_^
 
但是用户还是要用滚动条的
 
我也查到这种方法了,用个panel包含webbrowser,把panel的enabled设为false,但是滚动条也不起作用的...
 
我的问题已解决,用了2个钩子,日志钩子处理键盘,低级鼠标钩子处理鼠标,现在贴出来,
谁有更好的解决办法呢?

-------------------------------------------
library hookprj;

uses
SysUtils,
Classes,
hkprocunit in 'hkprocunit.pas';

{$R *.RES}
exports
EnableMouseHook,
DisableMouseHook,
EnableKeyHook,
DisableKeyHook;
begin

end.
------------------------------------------------------------
unit hkprocunit;

interface

uses
forms, extctrls, Windows, Messages, stdctrls, Sysutils, Classes;

var
hkMouse: HHOOK;
hkKey: HHOOK;
f_wnd: Hwnd;
f_rect: TRect;
f_form: TForm;
f_panel: TPanel;

function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT; stdcall;
function EnableMouseHook(a_form: TForm; a_panel: Tpanel; a_wnd: Hwnd):Boolean; stdcall; export;
function DisableMouseHook:Boolean; stdcall; export;

function KeyHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT; stdcall;
function EnableKeyHook(a_wnd: Hwnd):Boolean; stdcall; export;
function DisableKeyHook:Boolean; stdcall; export;

implementation

function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
var
m: PMOUSEHOOKSTRUCT;
v_rect: TRect;
PEvt: ^EVENTMSG;
begin
Result := 0;
if nCode < 0 then
begin
Result := CallNextHookEx(hkMouse,nCode,WParam,LParam);
exit;
end;

case wParam of
WM_RBUTTONDOWN,
WM_RBUTTONUP,
WM_LBUTTONDOWN,
WM_LBUTTONUP:
begin
m := PMOUSEHOOKSTRUCT(lParam);
v_rect := f_panel.BoundsRect;
MapWindowPoints(f_form.handle, 0, v_rect, 2); // 座标换算
Dec(v_rect.Right, 18);
Dec(v_rect.Bottom, 18);

// 如果鼠标在v_rect范围内
if PtInRect(v_rect, Point(m.pt.x, m.pt.y)) then
// 如果Form处于激活状态
if GetActiveWindow=f_form.handle then
begin
Result := 1; //丢弃消息
exit;
end;
end;
end;
Result := CallNextHookEx(hkMouse, nCode, wParam, lParam);
end;


function EnableMouseHook(a_form: TForm; a_panel: Tpanel; a_wnd: Hwnd):Boolean; stdcall; export;
begin
f_form := a_form;
f_panel := a_panel;
f_wnd := a_wnd;
if hkMouse = 0 then
begin
hkMouse := SetWindowsHookEx(14, @MouseHookProc,Hinstance,0); //使用低级鼠标钩子
Result := True;
end
else
Result := False;
end;

function DisableMouseHook:Boolean; stdcall; export;
begin
if hkMouse <> 0 then
begin
UnHookWindowsHookEx(hkMouse);
hkMouse := 0;
Result := True;
end
else
Result := False;
end;

function KeyHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
var
PEvt: ^EVENTMSG;
begin
Result := 0;
if nCode < 0 then
begin
Result := CallNextHookEx(hkKey,nCode,WParam,LParam);
exit;
end;

if (nCode = HC_ACTION) then
begin
pEvt := Pointer(DWord(lParam));
if (pEvt.message = WM_KEYDOWN) or (pEvt.message = WM_KEYUP) then
if f_wnd=GetActiveWindow then
begin
pEvt.paramL := 0; //将按键键值置为0
end;
end;

Result := CallNextHookEx(hkKey, nCode, wParam, lParam);
end;


function EnableKeyHook(a_wnd: Hwnd):Boolean; stdcall; export;
begin
f_wnd := a_wnd;

if hkKey = 0 then
begin
hkKey := SetWindowsHookEx(WH_JOURNALRECORD,@KeyHookProc,Hinstance,0);
Result := True;
end
else
Result := False;
end;

function DisableKeyHook:Boolean; stdcall; export;
begin
if hkKey <> 0 then
begin
UnHookWindowsHookEx(hkKey);
hkMouse := 0;
Result := True;
end
else
Result := False;
end;



end.
-----------------------------------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, RxHook, OleCtrls, SHDocVw, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Button3: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
WebBrowser1: TWebBrowser;
Button4: TButton;
Button5: TButton;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ private declarations }

public
{ public declarations }


end;

type
TWBPosition = (wbPosBottom, wbPosTop, wbPosRight);
var
Form1: TForm1;
v_wnd: HWND;
v_rec: TRect;

//下面是引用hookprj.dll中的函数。
function EnableMouseHook(a_form: TForm; a_panel: Tpanel; a_wnd: Hwnd):Boolean; stdcall; external 'Hookprj.dll';
function DisableMouseHook:Boolean; stdcall; external 'Hookprj.dll';
function EnableKeyHook(a_wnd: Hwnd):Boolean; stdcall; external 'Hookprj.dll';
function DisableKeyHook:Boolean; stdcall; external 'Hookprj.dll';


implementation


{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
EnableMouseHook(Form1, Panel1, v_wnd);
EnableKeyHook(v_wnd);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
DisableMouseHook;
DisableKeyHook;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
OpenDialog1.Execute;
WebBrowser1.Navigate(OpenDialog1.FileName);
v_wnd := GetActiveWindow;
end;



end.

------------------------------------------------------------------
 
disable后 放一个scrollbar再做处理 不知道能不能实现?
 
我的办法是另外复制一份临时文件再打开,这样不管怎么修改都对原文件没影响,实现起
来又简单.
 
不可能的,当打开一个网络上的word、excel时,其实这个文件已经被下载到了客户端。
 
to xmdsj
但是修改了原文件后,再引入新的文件时会出现"另存为。。。"对话框,客户可以直接保存文件了!
to dfw1001
有更好的解决办法吗? 有的话,再加200分。


 
我的方法对于保护原文件不被修改有效果,但是不让用户保存比较困难.
 
procedure openwordfile(Myword: TWordApplication; Myfile: string;IsVisible:Boolean); //打开Word文档函数。
//Myword:文档工程名称;Myfile:word文件名;IsVisible来控制是否显示。
var
FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,WritePasswordDocument,
WritePasswordTemplate, Format,MatchCase, MatchWholeWord, find1, rep1,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Replace: OleVariant;
{以上的变量都是Tdocument.open函数所必需的,都是系统默认的,详情请参看Word的Help}
{可能会碰到错误的提示,一种情况是Uses一下Office97就可以了。}
begin
Myword.Connect;
Myword.Visible :=false;
FileName := MyFile; //打开的文件名称。
confirmConversions := False;
ReadOnly := False;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := True;
WritePasswordDocument := '';
WritePasswordTemplate := '';
Format := wdOpenFormatDocument;
myWord.Documents.Open(FileName, ConfirmConversions,
readOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format);
Myword.Visible :=True;
Myword.Disconnect;
end;
//打开Word文档函数(结束)
这个你看一下
 
to app2001
我要求是Word到嵌入Form中,另外你这样做用户一样可以另存为。。。。
 
我也正找此方面的解决办法,你的程序对我启发很大,谢谢呀
 
建议用OleContainer来打开WORD,一切都可控,用Webbrower打开有时在某些安装有3721网络实名的机器上出现打不开Word的情况.
 
无论怎样,都要先将文档下载到本地吗? 那么安全问题如何解决,拷贝,粘贴倒可以屏蔽的,用word自身的保护功能,但是用户如果发现客户端可以直接拷走文件,那就。。。。。欢迎大家讨论。
 
WebOffice2004是一个基于Web的Web Office ActiveX控件,把word和excel等office软件集成在IE浏览器中,实现Web办公自动化。
提供的功能:
1,新建word,excel文档
2,打开word,excel文档
3,修改word,excel文档
4,保存Word,excel文档
5,对工具条的隐藏和显示
另外,在本版中WebOffice2004只负责编辑Word或者Excel的工作,不负责向服务器数据库传输数据和从服务器数据库下载数据,为此,我们自行研发了一套基于纯Java的客户端上传控件和下载控件。
客户端上传控件:主要用来向服务器端传输数据,支持标准的 RFC 1867 文件传输协议。服务器端只需使用向aspupload等上传控件接收数据即可。 原有的控件所采取的机制是客户端直接连接服务器的数据库,这样做的缺点是如果服务器上存在防火墙,将不能连接数据库。这样,此控件的实用性将大大降低,而我们此次升级主要是为了解决此问题。上传控件实现了从客户端上传一个或者多个文件的问题,即可以通过在空件中隐含的上传数据,而传统的使用 <input type="file" name="file1">这种客户端上传技术由于受到安全方面的限制,程序不能对file控件赋值,而我们的 上传控件解决了此难题,而且,我们的上传控件兼容所有的服务器端上传控件。

下载控件:此控件使从服务器下载数据到客户端的过程中速度明显的提高了,而且,有进度条显示,让客户直到数据下载的进程。

使用上面的两个控件后,我们可以很容易的把客户端编辑的word文档很容易的保存到服务器端的数据库中。


本产品支持所有版本的word,简单易用并附有完整的例子,很方便,如果有意,请发邮件到yehutxt@163.com索取试用版和完整的asp例子

本产品每套只需500元。

注意:试用版只能在本地机上免费使用2个月,功能跟正式版一样。
email;yehutxt@163.com
联系人:叶先生
 
我不需要保存文档,我要做的是防止文档的拷贝与另存为..我只要在客户端方便的预览,可以吗?
 
楼主,你的实现思路应该改一改。
Word文档打开时,其实已经被下载到了本地,所以要控制源头。
1. 用Com-Addin控制Word行为
2. 加密Word文档,也就是不用你的Addin就打不开这个文档
 
后退
顶部