标签: delphi技巧

delphi中dcef如何自定义referer信息?

TChromium自定义referer,在早期的dcef版本中,这样Append(‘Referer’,’http://www.bnwin.com’)就可以了,详细看下面代码,如果append不行,启用这句request.SetReferrer(request.url, REFERRER_POLICY_ALWAYS); 123456789101112131415161718192021procedure TMainForm.chrm1BeforeResourceLoad(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback; out Result: TCefReturnValue);var map: ICefStringMultimap; sAccept,sUserAgent:string;begin sAccept:= 'application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap,'+ ' application/vnd.ms-xpsdocument, application/xaml+xml,text/html,application/octet-stream, */*'; sUserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 QIHU 360EE'; map := TCefStringMultimapOwn.Create; request.GetHeaderMap(map); map.Append('Referer',request.url); map.Append('Accept',sAccept); map.Append('User-Agent',sUserAgent); // ShowMessage(map.getvalue(1)+' '+map.getkey(1)); request.SetHeaderMap(map); //map:=nil; //request.SetReferrer(request.url, REFERRER_POLICY_ALWAYS);end; 在高版本的dcef中自定义referer,可以直接定义request. 12345678910111213141516171819procedure TMainForm.ShowUrl(hurl,AllUrl:string);var Request: ICefRequest; Data: ICefPostData; Header: ICefStringMultimap; sUserAgent:string;begin if chrm1.Browser.IsLoading then chrm1.Browser.StopLoad; sUserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 QIHU 360EE'; Request := TCefRequestRef.New; Request.SetReferrer(hurl,REFERRER_POLICY_ORIGIN);//定义referer Data := TCefPostDataRef.New; Header := TCefStringMultimapOwn.Create; Header.Append('Accept-Language', 'zh-CN'); Header.Append('User-Agent',sUserAgent); Request.Assign(AllUrl,'POST',Data,header); chrm1.Browser.MainFrame.LoadRequest(Request);end;

delphi中如何让dcef支持flash插件播放视频?

Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。除了提供C/C++接口外,也有其他语言的移植版。因为基于Chromium,所以CEF支持Webkit & Chrome中实现的HTML5的特性,并且在性能上面,也比较接近Chrome。CEF还提供的如下特性:自定义插件、自定义协议、自定义JavaScript对象和扩展;可控制的resource loading, navigation, context menus等等。dcef是指的cef在delphi中的版本 cef在前期版本中是自带支持flash插件的,后来Chromium不再默认支持flash控件!下面看看我的程序的dcef命令行参数 如何让dcef支持flash呢? 安装好dcef,不管哪个版本都行! 安装360极速浏览器或QQ浏览器,打开其安装目录,找到ppflash目录和npflash目录(360极速浏览器是这两个目录,而QQ浏览器略有不同)! 在你的工程目录中建NativeFlash目录和PepperFlash目录,然后360的npflash目录下的NPSWF开头的dll文件和同目录下的vch文件复制到自己工程的NativeFlash中,把360的ppflash目录中的pepflash开头的dll文件和同目录下的json文件复制到工程的PepperFlash目录中!这一步就是用360浏览器的flash文件,不需要你手工去下载安装插件!至少你应该发现即使你的系统没有安装flash插件,但360浏览器安装后一样可以正常播放flash,这就是因为他的目录中自带了这几个flash文件,为了让你的程序的dcef支持flash,所以我们直接复制360极速浏览器的flash文件过来,简单方便! 编辑你的delphi工程文件(即dpr文件),在{$R *.res}后面添加如下代码123456789101112131415161718192021procedure AppendCefCmdline(const processType: ustring; const cmd: ICefCommandLine);begin //cmd.AppendSwitch('--enable-gpu-plugin');//允许gpu //cmd.AppendSwitch('disable-gpu');//禁止gpu cmd.AppendSwitch('enable-npapi'); //允许NativeFlash //cmd.AppendSwitch('enable-tab-audio-muting');//允许tab页禁音 //cmd.AppendSwitch('--enable-media-stream'); //允许视频流 cmd.AppendSwitchwithvalue('load-plugin', 'NativeFlash\NPSWF32.dll');//指定NativeFlash插件文件位置,注意文件名要和你的一致 //cmd.AppendSwitchWithValue('ppapi-flash-version','20.0.0.267');//指定PepperFlash版本号 cmd.AppendSwitchWithValue('ppapi-flash-path','PepperFlash\pepflashplayer.dll');//指定PepperFlash插件文件位置,注意文件名要和你的一致 cmd.AppendSwitch('--enable-system-flash');//允许PepperFlash //cmd.AppendSwitch('--enable-usermedia-screen-capturing');end; begin CefOnBeforeCommandLineProcessing :=AppendCefCmdline; //这一句就是指定了dcef启动的命令行 Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run;end. 很多人用delphi的dcef写的程序,不支持flash,是只在命令行中添加了允许flash,而没有指定flash插件文件的位置,这时dcef会去调用系统安装的flash插件,一旦系统插件有问题,你的程序就无法播放flash了,本文写的方法就是360极速浏览器的方法,不管你的系统安装不安装flash,一样播放flash!而要让dcefbrowser支持flash也一样,dcefbrowser中只是把CefOnBeforeCommandLineProcessing改为DcefBApp.OnBeforeCommandLineProcessing即可,至于播放flash会有dos窗口弹一下的问题,请看本站的这篇文章http://www.bnwin.com/2017/12/01/328.html

delphi如何实现任意窗口透明化?

1234567//声明:SetLayeredWindowAttributes( Hwnd: THandle; {窗口句柄} crKey: COLORREF; {透明色} bAlpha: Byte; {Alpha 值} dwFlags: DWORD {LWA_COLORKEY(=1)表示使用透明色; LWA_ALPHA(=2)表示使用 Alpha 值}): Boolean; {是否成功设置} 举例(控制外部程序的透明度, 用计算器举了个例子): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} {设定计算器的 Alpha 透明}procedure TForm1.Button1Click(Sender: TObject);var h: HWND; FormStyle: Integer;begin h := FindWindow('CalcFrame','计算器'); FormStyle := GetWindowLong(h, GWL_EXSTYLE); SetWindowLong(h, GWL_EXSTYLE, FormStyle or WS_EX_LAYERED); SetLayeredWindowAttributes(h, 0, 128, LWA_ALPHA);end; {设定计算器中的白色透明}procedure TForm1.Button2Click(Sender: TObject);var h: HWND; FormStyle: Integer;begin h := FindWindow('SciCalc', nil); FormStyle := GetWindowLong(h, GWL_EXSTYLE); SetWindowLong(h, GWL_EXSTYLE, FormStyle or WS_EX_LAYERED); SetLayeredWindowAttributes(h, clWhite, 255, LWA_COLORKEY);end; end.

dcef3加载flash闪烁问题简单解决方法

dcef3添加flash插件后,在播放flash时会有一个dos的黑框一闪而过,显示not sandboxed,影响使用体验! 一种方法是hook 具体可以看这篇文章 http://blog.csdn.net/zx2356/article/details/51514403这篇文章是使用的C语言,这儿采用同样的方法,在delphi中实现!代码如下HookExt.pas源码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100unit HookExt; interfaceuses uhook,Windows,SysUtils; type TFuncCreateProcessA = function(lpApplicationName: LPCSTR; lpCommandLine: LPSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCSTR; const lpStartupInfo: TStartupInfoA; var lpProcessInformation: TProcessInformation): BOOL; stdcall; TFuncCreateProcessW = function(lpApplicationName: LPCWSTR; lpCommandLine: LPWSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCWSTR; const lpStartupInfo: TStartupInfoW; var lpProcessInformation: TProcessInformation): BOOL; stdcall; implementation var hhk: HHook; MapFile: THandle; startPID: PDWORD; Hook: array [0 .. 1] of TNtHookClass; function NewCreateProcessA(lpApplicationName: LPCSTR; lpCommandLine: LPSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCSTR; const lpStartupInfo: TStartupInfoA; var lpProcessInformation: TProcessInformation): BOOL; stdcall;var strCommandLine: AnsiString;begin strCommandLine := StrPas(lpCommandLine); if (Pos('echo NOT SANDBOXED',strCommandLine)>0) or (Pos('no-sandbox',strCommandLine)>0) then Result := True else begin Hook[0].UnHook; Result := TFuncCreateProcessA(Hook[0].BaseAddr)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); Hook[0].Hook; end;end; function NewCreateProcessW(lpApplicationName: LPCWSTR; lpCommandLine: LPWSTR; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCWSTR; const lpStartupInfo: TStartupInfoW; var lpProcessInformation: TProcessInformation): BOOL; stdcall;var strCommandLine: string;begin strCommandLine := StrPas(lpCommandLine); if (Pos('echo NOT SANDBOXED',strCommandLine)>0) or (Pos('no-sandbox',strCommandLine)>0) then Result := True else begin Hook[1].UnHook; Result := TFuncCreateProcessW(Hook[1].BaseAddr)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); Hook[1].Hook; end;end; // 安装API Hookprocedure InitHook;begin Hook[0] := TNtHookClass.Create('kernel32.dll', 'CreateProcessA', @NewCreateProcessA); Hook[1] := TNtHookClass.Create('kernel32.dll', 'CreateProcessW', @NewCreateProcessW); // Hook[2] := TNtHookClass.Create( 'user32.dll', 'MessageBoxA', @NewMessageBoxA );end; // 删除API Hookprocedure UnInitHook;var i: Integer;begin for i := 0 to High(Hook) do FreeAndNil(Hook[i]);end; // 环境处理procedure DllEntry(dwReason: DWORD);begin case dwReason of DLL_PROCESS_ATTACH: InitHook; DLL_PROCESS_DETACH: UnInitHook; end;end; initialization InitHook; finalization UnInitHook;end. 其中的uHook.pas源码:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788unit uHook; interface usesWindows, Messages, SysUtils;type TNtJmpCode = packed record MovEax: Byte; Addr: DWORD; JmpCode: Word; dwReserved: Byte; end; TNtHookClass = class(TObject) private hProcess: THandle; NewAddr: TNtJmpCode; OldAddr: array [0 .. 7] of Byte; ReadOk: Boolean; public BaseAddr: Pointer; constructor Create(const ADllName, AFuncName: string; ANewFunc: Pointer); destructor Destroy; override; procedure Hook; procedure UnHook; end; implementation { TNtHookClass } constructor TNtHookClass.Create(const ADllName, AFuncName: string; ANewFunc: Pointer);var dllModule: HMODULE; lpNumberOfBytesReacd: DWORD; //NativeUInt; i:Integer;begin // 获取模块句柄 dllModule := GetModuleHandle(PWideChar(ADllName)); if dllModule = 0 then dllModule := LoadLibrary(PWideChar(ADllName)); // 得到模块入口地址 BaseAddr := Pointer(GetProcAddress(dllModule, PWideChar(AFuncName))); // 获取当前进程句柄 hProcess := GetCurrentProcess; // 指向新地址的指针 NewAddr.MovEax := $B8; NewAddr.Addr := DWORD(ANewFunc); NewAddr.JmpCode := $E0FF; // 保存原始地址 ReadOk:=ReadProcessMemory(hProcess, BaseAddr, Pointer(@OldAddr), 8, lpNumberOfBytesReacd); // 开始拦截 Hook; end; destructor TNtHookClass.Destroy;begin UnHook; CloseHandle(hProcess); inherited;end; procedure TNtHookClass.Hook;var lpNumberOfBytesRead: DWORD;begin if not ReadOk then exit; // 写入新的地址 WriteProcessMemory(hProcess, BaseAddr, @NewAddr, 8, lpNumberOfBytesRead);end; procedure TNtHookClass.UnHook;var lpNumberOfBytesRead: DWORD;begin if not ReadOk then exit; // 恢复地址 WriteProcessMemory(hProcess, BaseAddr, @OldAddr, 8, lpNumberOfBytesRead); end; end. 这种hook处理不好就容易蓝屏,更简单的方法如下:用二进制编辑软件,比如winhex,我这儿采用UltraEdit,用UltraEdit打开flash插件dll文件 pepflashplayer.dll 搜索comspec修改为somspec,(修改的名字只要和comspec不相同即可)修改cmd.exe为cm1.exe (修改的名字只要和cmd.exe不相同即可) 修改后为 然后保存即可,这时打开flash就不会有dos黑框闪一下了! 第三种方法,更简单,什么都不用修改,只要在你的程序目录下新建一个文本文件,然后改名为cmd.exe,因为弹出黑框需要使用cmd程序,而系统搜索程序是从进程当前的工作目录开始查找,所以直接这样建一个不能执行的cmd.exe文件可以拦截cmd的调用。这个方法最简单! 第一种hook方法是修改flash文件,但其实是采用动态方法改了汇编代码,处理不好容易蓝屏。第二种方法修改flash插件文件,原理是:flash执行cmd的逻辑是,先读取环境变量comspec(cmd.exe的全路径),读取到就执行它,读取不到就不执行cmd.exe.只要把变量和cmd.exe名字修改,就执行不成功,就没有DOS黑框出来!第一种方法是在flash插件要运行cmd.exe的时候再进行拦截,是动态修改的,而第二种是直接让flash找不到变量和cmd.exe程序,flash自己判断不用执行,是静态修改!第三种是懒人方法!但几种方法实现的效果都是阻止cmd.exe的正常执行!同时你就可以这样思考了,为了让flash不出现闪黑框的问题,就变成了如何阻止cmd.exe的执行,比如你在你自己的程序中先修改一下comspec环境变量,也是可以阻止cmd.exe执行的,大家自由发挥!

如何自定义修改TChromium的header头信息!

TChromium自定义post的header信息提交数据1234567891011121314151617181920212223242526272829uses ceflib; function CreateField(const AValue: AnsiString): ICefPostDataElement;begin Result := TCefPostDataElementRef.New; Result.SetToBytes(Length(AValue), PAnsiChar(AValue));end; procedure TForm1.Button1Click(Sender: TObject);var Header: ICefStringMultimap; Data: ICefPostData; Request: ICefRequest;begin Header := TCefStringMultimapOwn.Create; Header.Append('Content-Type', 'application/x-www-form-urlencoded'); Data := TCefPostDataRef.New; Data.AddElement(CreateField('Data.id=27')); Data.AddElement(CreateField('&Data.title=title')); Data.AddElement(CreateField('&Data.body=body')); Request := TCefRequestRef.New; Request.Flags := WUR_FLAG_NONE; Request.Assign('http://example.com/', 'POST', Data, Header); Chromium1.Browser.MainFrame.LoadRequest(Request);end; 在另一版本中的代码1234567891011121314151617181920212223procedure TForm1.Button1Click(Sender: TObject);var Header: ICefStringMultimap; Data: ICefPostData; Request: ICefRequest;begin Request := TCefRequestRef.New; Request.Url := 'http://example.com/'; Request.Method := 'POST'; Request.Flags := WUR_FLAG_NONE; Header := TCefStringMultimapOwn.Create; Header.Append('Content-Type', 'application/x-www-form-urlencoded'); Request.SetHeaderMap(Header); Data := TCefPostDataRef.New; Data.AddElement(CreateField('Data.id=27')); Data.AddElement(CreateField('&Data.title=title')); Data.AddElement(CreateField('&Data.body=body')); Request.PostData := Data; Chromium1.Browser.MainFrame.LoadRequest(Request);end; TChromium自定义post数据123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051function CreateField(const AValue: AnsiString): ICefPostDataElement;begin Result := TCefPostDataElementRef.New; Result.SetToBytes(Length(AValue), PAnsiChar(AValue));end; //***************************************** procedure POST(total, fee: integer);var Header: ICefStringMultimap; Data: ICefPostData; Request: ICefRequest; Cook: ICefCookieManager;begin Request := TCefRequestRef.New; Request.Url := ''; Request.Method := 'POST'; Request.Flags:=[UR_FLAG_ALLOW_CACHED_CREDENTIALS,UR_FLAG_ALLOW_COOKIES]; Header := TCefStringMultimapOwn.Create; Header.Append('Host', ''); Header.Append('User-Agent', ''); Header.Append('Accept', ''); Header.Append('Accept-Language', ''); Header.Append('Accept-Encoding', ''); Header.Append('Content-Type', ''); Header.Append('Referer', ''); Header.Append('Content-Length', ''); Header.Append('Origin', ''); Header.Append('Connection', ''); Header.Append('Pragma', ''); Header.Append('Cache-Control', ''); Header.Append('Cookie','...'); ... Header.Append('Cookie','...'); Request.SetHeaderMap(Header); Data := TCefPostDataRef.New; Data.AddElement(CreateField('sessionid='+SessionID)); Data.AddElement(CreateField('¤cy=5')); Data.AddElement(CreateField('&subtotal='+inttostr(total-fee))); Data.AddElement(CreateField('&fee='+IntToStr(fee))); Data.AddElement(CreateField('&total='+IntToStr(total))); Request.PostData := Data; form1.Chromium1.Browser.MainFrame.LoadRequest(Request);end;

如何让dcef3支持mp3和h.264_mp4解码播放(有源码及dll)!

嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。它的设计思想政治就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和Chromium&Webkit的操作细节。它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户插件,协议,javascript对象以及javascript扩展,宿主程序可以随意地控件资源下载,导航,下下文内容和打印等,并且可以跟Google Chrome浏览器一起,支持高性能和Html5 技术 为什么chromium不支持mp3和h.264的mp4音视频解码,因为h.264编码并非开源,是需要付费的!所以就存在谷歌自己的浏览器chrome能支持mp4和tchromium不支持mp4!如何查看你的tchromium是否支持mp4呢?你用tchromium写一个简单浏览器,然后打开http://html5test.com 支持是这样显示的 而不支持是这样显示的 也就是支持h.264 support mp3 support和aac support应该是钩! 要让cef支持mp3和mp4,需要自己编译,如果你对自己如何编辑有兴趣可以看这篇文件 在Windows下编译Cef3.2623并加入mp3、mp4支持 对于delphi用户,如何让在delphi中dcef3支持mp3和mp4呢?先到这儿下载dcef3 3.2623.1401 http://download.csdn.net/download/cyu/9917747 (如果没有积分就到这儿下载 链接:https://pan.baidu.com/s/1dFETI0L 密码:gult ) 你也可以安装dcefbrowser,封装后的dcef3 这儿下载dcefbrowser3.2623.1401 https://github.com/bccsafe/DcefBrowser (你也可以到这儿下载dcefbrowser 链接:https://pan.baidu.com/s/1dFB5Zv7 密码:fljs )不管你是下载的dcef3 3.2623.1401 还是下载的dcefbrowser 3.2623.1401都可以,安装控件后,运行示例程序,这时你的dcef是不支持mp3和mp4的,为什么呢?因为h.264等编码问题,作者打包的dll库文件是默认不支持mp3和mp4的! 如何让delphi中dcef3支持mp3和mp4呢?你只需要到这儿下载 链接:https://pan.baidu.com/s/1c1DZ1DY 密码:sqir 已经编译好支持mp3和mp4的dll库,覆盖到前面安装的控件中,就OK了,因为这个dll库是对应于dcef3.2623.1401,所以dcef必须也要安装3.26.23.1401。如何让delphi中dcef3支持mp3和mp4呢?因为非开源问题,所以自己编译dcef3的dll库的不多,提供下载的也不多,为了让你的dcef3支持mp3和mp4,我们只要找对应的版本就可以使用了!为什么非要指定dcef3为3.2623.1401,这是因为编译cef的dll需要开启mp3和mp4支持,网上提供其他版本的cef的dll库,并且加入了支持mp3和mp4的没有,如果你会C++,会自己编译cef的库,那什么版本都一样,都可以支持mp3和mp4 附dcef3另一版本及库文件:dcef3.2454 下载http://download.csdn.net/download/bigcoolfish/9616325 相对应已添加支持mp3和mp4的 dcef3.2454 dll库文件下载 https://pan.baidu.com/s/1pKHbeY3 密码: mxr2

TChromium获取网页源代码delphi代码

使用Webbrowser取得网页源代码网上已经有很多例子了,而TChromium如何获得网页源代码呢? 第一种方法1234567891011procedure TCustomLoad.OnLoadEnd(const browser: ICefBrowser;const frame: ICefFrame; httpStatusCode: Integer);vardata:tstringlist;begindata:=tstringlist.create;if frame.IsMain thendata.text:=frame.Source; // HTML Sourceend;data.free;end; 在dcef3中123456789101112procedure StringVisitor(const str: ustring);begin//str is the SourceHtmlshowmessage(str);end;function GetSourceHTML: string;varCefStringVisitor:ICefStringVisitor;beginCefStringVisitor := TCefFastStringVisitor.Create(StringVisitor);Chromium1.Browser.MainFrame.GetSource(CefStringVisitor);end; 第三种1Chromium1.Browser.MainFrame.ViewSource;