在WebBrowser控件上禁用Ctrl + P(打印)

时间:2010-11-20 07:25:21

标签: delphi printing browser

我在delphi应用程序中使用webbrowser。如何禁用Ctrl + P以防止打印?

3 个答案:

答案 0 :(得分:5)

请看下面的代码:

var
 mClass : Array[0..1024] of Char;
begin
 if (GetClassName(Msg.hwnd, mClass, 1024) > 0) then
  begin
   if (StrIComp(@mClass, 'Internet Explorer_Server') = 0) then
    begin
     if Msg.message = WM_KEYDOWN then
      Handled := (Msg.wParam = Ord('P')) and (GetKeyState(VK_CONTROL) <> 0);
    end
  end;
end;

为了防止发送到TWebBrowser控件的消息,我们可以获取消息接收者的类名,然后将类名与“Internet Explorer_Server”(IE Server Calss Name)进行比较,如果类名相等则可以确保将消息发送到WebBrowser Control,现在您可以处理消息到达... 在上面的代码中我们这样做是为了处理Ctrl + P快捷键,但你可以使用这个想法更像是禁用上下文菜单或... 请注意,当WebBrowser中加载页面时,消息将发布到IE Server而不是TWebBrowser Handle ...

首先在表单上放置TApplicationEvents,然后从此处复制/粘贴代码到它的OnMessage事件......

祝你好运......

答案 1 :(得分:0)

我使用了EmbeddedWB,通过这个微小的代码解决了我的问题:

procedure TForm1.EmbeddedWb1KeyDown(Sender: TObject; var Key: Word; ScanCode: Word;
  Shift: TShiftState);
begin
  Key := 0;
end;

答案 2 :(得分:0)

这是一个旧线程,但我想用我发现的方法更新。这建立在@Mahmood_N的有用帖子的基础上。

请注意,我首先编写了代码以获取类名,并将其与“Shell嵌入”进行比较,后者显示了TWebBrowser消息(请参阅此处:https://support.microsoft.com/en-us/kb/244310)。但是我的应用程序将包含多个TWebBrowser,因此我通过直接获取窗口句柄将其修改为更好,并使用它来与窗口消息的句柄进行比较。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AppEvnts, StdCtrls, OleCtrls, SHDocVw, ActiveX;

type
  TForm1 = class(TForm)
    WebBrowser: TWebBrowser;
    ApplicationEvents1: TApplicationEvents;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  private
    { Private declarations }
    WBHandle : THandle;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetStrClassName(Handle: THandle): String;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  Windows.GetClassName(Handle, @Buffer, MAX_PATH);
  Result := String(Buffer);
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  ClassName : string;
begin
  ClassName := GetStrClassName(Msg.hwnd);
  //if Pos('Shell Embedding', ClassName) > 0 then begin
  if Msg.hwnd = WBHandle then begin
    if Msg.message = WM_KEYDOWN then begin
      Handled := (Msg.wParam = Ord('P')) and (GetKeyState(VK_CONTROL) <> 0);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var Win : IOLEWindow;
    WinHandle : HWND;
begin
  WBHandle := 0;
  if WebBrowser.ControlInterface.QueryInterface(IOleWindow, Win) = 0 then begin
    if Win.GetWindow(WinHandle) = 0 then begin
      WBHandle := WinHandle;
    end;
  end;
end;