2010-11-20 13 views
1

J'utilise webbrowser dans mon application Delphi. comment puis-je désactiver Ctrl + P pour empêcher l'impression?Désactiver Ctrl + P (Imprimer) sur le contrôle WebBrowser

+0

Vous pouvez intercepter la pression de touche sous la forme hôte, mais ce ne serait pas juste assez pour empêcher l'impression ... Vous devez également intercepter Ctrl + C (copier), sélection dans la fenêtre du navigateur (qui pourrait être copié aussi), et vous devriez également empêcher l'impression par capture d'écran (qui peut être accomplie en appuyant simplement sur la touche "Imprimer l'écran", même avec le focus dans une autre application, et coller le résultat dans Word ou WordPad) . –

Répondre

5

Regardez le code ci-dessous:

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; 

Pour éviter que les messages envoyés à un contrôle TWebBrowser, on peut obtenir le nom de la classe de récepteur de message, puis comparer le nom de classe avec « Internet Explorer_Server » qui est l'IE Serveur Calss Nom, si les noms de classes sont égaux, alors vous pouvez vous assurer que le message envoyé à WebBrowser Control, maintenant vous pouvez gérer le message arrivé ... Dans le code ci-dessus, nous faisons cela pour gérer Ctrl + P Raccourci, mais vous pouvez utilisez cette idée pour désactiver le menu contextuel ou ... Notez que lorsqu'une page est chargée dans WebBrowser, les messages seront envoyés à IE Server et non à TWebBrowser Handle ...

d'abord mettre un TApplicationEvents sur le formulaire, suivant Copier/Coller le code d'ici à s `événement OnMessage ...

Bonne chance ...

+0

MerC Mahmood jan. Merci – Kermia

+0

Cela n'a pas fonctionné pour moi. Quand j'examine les messages, je vois le nom de la classe comme 'Shell Embedding', pas 'Internet Explorer_Server'. Peut-être que quelque chose a changé depuis sa publication en 2010. – kdtop

0

je EmbeddedWB et mon problème résolu par cette code minuscule:

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

Ceci est un ancien thread, mais je voulais mettre à jour avec la méthode que j'ai trouvé pour fonctionner. Cela s'appuie sur le message utile de @Mahmood_N.

Notez que j'ai écrit le code pour obtenir le nom de classe, et que comparais à Shell Embedding », ce qui est apparu pour les messages TWebBrowser (voir ici: https://support.microsoft.com/en-us/kb/244310). Mais mon application inclura plus d'un TWebBrowser, donc je l'ai modifié pour être meilleur, en obtenant directement le handle de fenêtre, et l'employez pour la comparaison avec le handle du message de fenêtre.

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;