我在delphi应用程序中使用webbrowser。如何禁用Ctrl + P以防止打印?
答案 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;