分类: 文章

如何快速让cef、wke、blink等支持mp4和mp3

如何快速让cef、wke、blink等支持mp4和mp3(支持html5的video和audio标签)?在cef中,默认是不支持mp3和mp4的,使用cef控件写的软件打开带有video或audio标签的视频或音频是会播放失败的!一种方法就是自己重新编译cef的库,加入支持mp3和mp4的支持。如何编译看这篇文章 如何让dcef3支持mp3和h.264 mp4解码播放(有源码及dll)! 这是从文件的本身出发,修改后支持mp3和mp4,从另一方面来说,采用cef的精简版控件,比如wke,blink或低版本的ie等,修改文件重新编译支持mp3和mp4的方法就不可行了!能不能不修改文件直接支持mp3和mp4的video和audio标签呢?这儿介绍一种修改html本身而不动浏览器控件文件的解决方法,当然你得有修改html文件的权限。 使用html5media让浏览器兼容<Video><Audio>标签。html5media是一个开源项目html5media 官网:https://html5media.info/html5media 项目:https://github.com/etianen/html5mediahtml5media Wiki:https://github.com/etianen/html5media/wiki html5media 官网CDN:http://api.html5media.info/1.2.2/html5media.min.jshtml5media 国内CDN:http://www.bootcdn.cn/html5media/ 如何使用html5media?它只需要一行代码就可以使HTML5的video和audio标签在所有主流浏览器中都能正常工作。只需要在html的head文档中添加如下代码 1< script src = “ http://api.html5media.info/1.1.8/html5media.min.js ” > </ script > 然后按照html5的video标签添加的视频 1< video src="video.mp4" preload="" controls="controls" width="320" height="200"> 按照html5的audio标签添加的音频

delphi如何实现php中的parse_url网址拆分函数?

php中拆分URL的一个很重要的函数就是parse_url();但在delphi如何不正则分析就可以实现如此方便的功能呢?实际上delphi的indy有一个单元实现此功能-IdURI单元,实现如下分拆 1234http://login:password@somehost.somedomain.com:8080/some_path/something.html?param1=val&param2=val#nose\__/ \___/ \______/ \_____________________/ \__/\_______________________/ \___________________/ \__/ | | | | | | | |Scheme Username Password Host Port Path Query Fragment 123456789101112131415161718uses ..., IdURI; var URI: TIdURI; URI := TIdURI.Create('http://login:password@somehost.somedomain.com:8080/some_path/something_else.html?param1=val&param2=val');try Protocol = URI.Protocol Username = URI.Username Password = URI.Password Host = URI.Host Port = URI.Port Path = URI.Path Query = URI.Paramsfinally URI.Free;end; 以下是使用InternetCrackUrl方法实现(依赖windows的WinInet库) 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758{$APPTYPE CONSOLE} uses Windows, SysUtils, WinInet; procedure ParseURL(const lpszUrl: string);var lpszScheme : array[0..INTERNET_MAX_SCHEME_LENGTH - 1] of Char; lpszHostName : array[0..INTERNET_MAX_HOST_NAME_LENGTH - 1] of Char; lpszUserName : array[0..INTERNET_MAX_USER_NAME_LENGTH - 1] of Char; lpszPassword : array[0..INTERNET_MAX_PASSWORD_LENGTH - 1] of Char; lpszUrlPath : array[0..INTERNET_MAX_PATH_LENGTH - 1] of Char; lpszExtraInfo : array[0..1024 - 1] of Char; lpUrlComponents : TURLComponents;begin ZeroMemory(@lpszScheme, SizeOf(lpszScheme)); ZeroMemory(@lpszHostName, SizeOf(lpszHostName)); ZeroMemory(@lpszUserName, SizeOf(lpszUserName)); ZeroMemory(@lpszPassword, SizeOf(lpszPassword)); ZeroMemory(@lpszUrlPath, SizeOf(lpszUrlPath)); ZeroMemory(@lpszExtraInfo, SizeOf(lpszExtraInfo)); ZeroMemory(@lpUrlComponents, SizeOf(TURLComponents)); lpUrlComponents.dwStructSize := SizeOf(TURLComponents); lpUrlComponents.lpszScheme := lpszScheme; lpUrlComponents.dwSchemeLength := SizeOf(lpszScheme); lpUrlComponents.lpszHostName := lpszHostName; lpUrlComponents.dwHostNameLength := SizeOf(lpszHostName); lpUrlComponents.lpszUserName := lpszUserName; lpUrlComponents.dwUserNameLength := SizeOf(lpszUserName); lpUrlComponents.lpszPassword := lpszPassword; lpUrlComponents.dwPasswordLength := SizeOf(lpszPassword); lpUrlComponents.lpszUrlPath := lpszUrlPath; lpUrlComponents.dwUrlPathLength := SizeOf(lpszUrlPath); lpUrlComponents.lpszExtraInfo := lpszExtraInfo; lpUrlComponents.dwExtraInfoLength := SizeOf(lpszExtraInfo); InternetCrackUrl(PChar(lpszUrl), Length(lpszUrl), ICU_DECODE or ICU_ESCAPE, lpUrlComponents); Writeln(Format('Protocol : %s',[lpszScheme])); Writeln(Format('Host : %s',[lpszHostName])); Writeln(Format('User : %s',[lpszUserName])); Writeln(Format('Password : %s',[lpszPassword])); Writeln(Format('Path : %s',[lpszUrlPath])); Writeln(Format('ExtraInfo: %s',[lpszExtraInfo]));end; begin try ParseURL('http://login:password@somehost.somedomain.com/some_path/something_else.html?param1=val&param2=val'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; readln;end. 以上运行输出效果Protocol : httpHost : somehost.somedomain.comUser : loginPassword : passwordPath : /some_path/something_else.htmlExtraInfo: ?param1=val&param2=val

如何取得窗口的Z序

如何取得窗口的Z序_How to get the window`s z-order?Z 序:一个重叠窗口的堆,每个窗口在Z 序中 都有唯一一个位置。一个窗口的Z 序 ,指明了该窗口在重叠窗口堆中的位置。这个窗口堆 是沿着一个虚拟的轴——“ Z 轴”,从屏幕上垂直向屏幕外延伸。 Z 序顶部的窗口覆盖 Z 序中的其他窗口。 Z 序底部的窗口被 Z 序中的其他窗口覆盖。 系统用一个单链表维护 Z 序。系统按照顶端窗口、顶层窗口和子窗口的分类 ,将窗口插入到 Z 序表中。顶端窗口覆盖其他所有非顶端窗口,而不管它是不是活动窗口或是不是前台窗口。顶端窗口有 WS_EX_TOPMOST 风格。在 Z 序中,所有顶端窗口都在非顶端窗口之前。在 Z 序中,子窗口是按着他的父窗口进行分组的。 应用程序一旦创建了一个窗口,系统就将其放入Z 序中 同类窗口的顶部。可以调用 BringWindowToTop() 函数,把某窗口拉到 Z 序中同类窗口的顶部。可以利用 SetWindowPos() 和 DeferWindowPos() 函数对 Z 序进行重新排列。 用户在激活不同的窗口过程中会改变 Z 序。因为系统会将活动窗口,放置在 Z 序中同类窗口的顶部 。当一个窗口变成 Z 序中的顶层窗口时,它的所有子窗口也变为顶层窗口。可以用 GetTopWindow() 来查找一个父窗口的所有子窗口,并返回( Z 序中)顶部子窗口的句柄。用 GetNextWindow() 函数,可以获得 Z 序中的前一个或后一个窗口的句柄。 对于顶端窗口,顶层窗口和子窗口,如果只考虑同一类的话,如果有多个,总会一个覆盖另一个。但是这三类是按照上面讲的排列的。也就是有人讲的:1.TopMost在最上面2,顶级窗口次之3,子窗口在父窗口之上4,同级窗口当前激活窗口在前 HDWP hdwp = BeginDeferWindowPos(2); hdwp = DeferWindowPos( hdwp, hStatic, NULL, 0, 0,100, 20, SWP_NOACTIVATE | SWP_NOZORDER |SWP_NOMOVE );hdwp = DeferWindowPos( hdwp, hEdit, NULL, 0, 0, 100, 20, SWP_NOACTIVATE | SWP_NOZORDER |SWP_NOMOVE );EndDeferWindowPos( hdwp ); 其作用和SetWindowPos()差不多。 6.HWND GetWindow(HWND hWnd,UINT uCmd)

迅雷地址、快车地址和QQ旋风地址加解密原理

迅雷地址和快车地址的加密方式很简单,其实都是用的Base64加密方式,只不过有一点点的小改动而已。 1. 迅雷链接地址加密方式迅雷链接地址转换原理是在地址的前方和后方加入两个字母AA、ZZ,然后再进行Base64加密,再加上Thunder://这个专用链接标识,从而转换成迅雷的专用地址。例如:原链接为:http://www.forece.net/win7.rar在原地址前面加”AA”,后面加”ZZ”(注:不包括引号),地址变为AAhttp://www.forece.net/win7.rarZZ此地址base64编码为QUFodHRwOi8vd3d3LmZvcmVjZS5uZXQvd2luNy5yYXJaWg==加入迅雷专链标识,即在上地址前加thunder://,即thunder://QUFodHRwOi8vd3d3LmZvcmVjZS5uZXQvd2luNy5yYXJaWg== 2. 网际快车链接地址加密方式网际快车的链接地址转换原理和迅雷的类似,只不过是在地址前后加上[FLASHGET],经过Base64加密,然后在地址前加flashget://这个快车专用链接标识,最后还需要加一个标识符(&符号),符号任意,我一般就加我的名字(&forece),这样就可以将普通http地址转换成快车的地址了。例如:原链接为:http://www.forece.net/win7.rar在原地址前后都加上”[FLASHGET]“(注:不包括引号),地址变为[FLASHGET]http://www.forece.net/win7.rar[FLASHGET]此地址base64编码为 W0ZMQVNIR0VUXWh0dHA6Ly93d3cuZm9yZWNlLm5ldC93aW43LnJhcltGTEFTSEdFVF0= 加上快车专链标识和结尾符号,即在上地址前加flashget://,结尾加&forece,即 flashget://W0ZMQVNIR0VUXWh0dHA6Ly93d3cuZm9yZWNlLm5ldC93aW43LnJhcltGTEFTSEdFVF0=&forece “&符号”,符号怎么得出我也不清楚,只是看网上别人这么写的,至今无人报错。 3. QQ旋风链接地址加密方式

Delphi中那些容易混淆的基础知识

1. @、^、Addr、PointerDelphi(Pascal)中有几个特殊的符号,如@、^等,弄清楚这些符号的运行,首先要明白Delphi指针的一些基础知识:指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。指针的指针就是用来存放指针所在的内存地址的。明白了指针的基本含义,就容易理解它们之间 的区别了: @XX:取变量、函数或过程XX的地址(获取指针); Addr(XX):和@的作用类似,唯一的不同在于如果编译选项{$T-}没有打开,@返回的是一个通用的指针,如果编译选项打开了,@返回的是XX对应的指针,但Addr却不受此编译选项的约束。 ^:当它出现在类型定义的前面时如 ^typename 表示指向这种类型的指针; 当它出现在指针变量后边时 如 point^ 返回指针指向的变量的值; Pointer:无类型指针(对应PChar、PInteger等则为“有类型指针”)。通过这段代码则更容易区分它们:12345678varX, Y: Integer; // X and Y 整数类型P: ^Integer; // P 指向整数类型的指针beginX := 11; // 给 X 赋值P := @X; // 把 x的地址赋给pY := P^; // 取出p所指向的数值赋给yend; 第二行定义了两个变量X,Y。 第三行声明了P是指向整数类型的指针;意味着P能够指向X或者Y的地址。第五行赋给X值,第六行把X的地址赋给P。最后通过P指向的变量赋值给Y。此时,X和Y有相同的值。2. Char、Byte Char是一个字符,必须赋以字符如‘A’等; Byte是无符号整数,数值范围0~255。虽然字符实质上也是整数,但与C不同,Delphi中将他们划为两种不同的类型,各自遵从不同的运算。比如运算符+对于Byte是整数加法,对于Char则是字符连接成串。他们可以相互转化:Ord(‘A’)得到字符对应的整数,Chr(65)得到整数对应的字符。同理,就很好区分array of Byte和array of Char了。3. Move、CopyMemoryMove字面意思上是“移动”的意思,其实不然,在Delphi中Move更像是Copy:它可以复制一段内存片段到另外一段内存空间中。如下代码:1234567891011121314151617var source, dest : string;begin // Set up our starting string source := '123456789'; dest := '---------'; // Copy a substring from source into the middle of dest Move(source[5], dest[3], 4); // Show the source and destination strings ShowMessage('Source = '+source); ShowMessage('Dest = '+dest);end;//结果------------------//Source = 123456789//Dest = --5678--- 而CopyMemory则可以在Delphi的源码中看出端倪:1234procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);begin Move(Source^, Destination^, Length);end; 可以看出,CopyMemory其实也是调用了Move方法,但参数变了,CopyMemory参数是指针。当然,从源码还可以发现MoveMemory和CopyMemory是一模一样的功能。CopyMemory一般的使用方法为:123456789var buf1,buf2: array[0..9] of AnsiChar;begin buf1 := '0123456789'; buf2 := 'abcdefghij'; CopyMemory(@buf2[2], @buf1[4], 5); ShowMessage(buf1); {0123456789} ShowMessage(buf2); {ab45678hij}end; 4. GetMem和FreeMem、GetMemory和FreeMemory、New和Dispose、StrAlloc和StrDispose、AllocMemDelphi中的内存申请和释放方法比较多,但有一点儿需要牢记的是上述方法建议配对使用。GetMem和FreeMem与GetMemory和FreeMemory在Delphi的源码中可以看到是被调用和调用的关系,FreeMemory会判断指针是否为空:123456789101112function GetMemory(Size: Integer): Pointer; cdecl;begin Result := MemoryManager.GetMem(Size);end; function FreeMemory(P: Pointer): Integer; cdecl;begin if P = nil then Result := 0 else Result := MemoryManager.FreeMem(P);end; 因此,建议用GetMemory和FreeMemory代替GetMem和FreeMem。New和Dispose是用来管理变体类型内存分配,如变体结构体:12345TRecord = recordText: string;Value: Integer;end;PRecord = ^TRecord; 如果用GetMem和FreeMem、GetMemory和FreeMemory来释放,会造成Text的内存没有释放,造成内存泄漏。如果用Dispose来释放指针,要加上定义信息,否则造成内存泄漏,正确写法Dispose(PRecord(Point))。另外需要注意的一点是:Delphi设计的Dispose释放内存时,只是标记这部分内存可以再用来被New等函数分配,并不是把从系统申请到的内存归还给操作系统,只在程序结束时,才全部释放给操作系统,因此并不能在资源管理器中看到Dispose的“显著效果”。一般使用方法如下:12345678910111213141516Type PMyRec = ^TMyRec; TMyRec = record  FName: string;  LName: string; end;var MyRecPtr: PMyRec; TreeViewIndex: LongInt;begin New(MyRecPtr); MyRecPtr^.FName := Edit1.Text; MyRecPtr^.LName := Edit2.Text; {其他处理} Dispose(MyRecPtr);end; StrAlloc和StrDispose这个函数也是一对,他们分配PChar加一个Cardinal长度,因此一定要用StrDispose释放,否则容易造成4字节的内存泄漏。StrAlloc分配的指针可以使用StrBufSize来获得大小。AllocMem和GetMem的区别在于AllocMem在申请内存后会初始化这段内存(把内存全部初始化为#0),同样和FreeMem配对使用。

RemoteAdo数据库中间件爆破分析(RemoteAdo破解版)

RemoteAdo是一款数据库中间件,官网为http://www.remoteado.cn/ 本爆破教程基于RemoteAdo标准版4.2分析! 下载RemoteAdo标准版4.2,使用die1.01分析,RemoteAdoServer.exe主程序加壳为ASPack(2.12) 使用WASPACK脱掉 用OD载入,插件打开api常用断点下MessageBoxA断点,为什么下这个断点呢?因为点注册的时候会弹出序列号无效 ,断点下好后,按F9运行,按RemoteAdo软件界面中的其他选项卡中的“请注册”,在弹出的窗口中任意输入序列号然后点击注册按钮!这时在OD中已经断下了,按一次Ctrl+F9,再切换到RemoteAdo软件界面,这时提示“序列号无效”,点确定,然后切换为OD,再按一次Ctrl+F9,OD中返回到RemoteAdo的软件领空! 我们看右边寄存器显示有“序列号无效”和“软件注册”等字样! 从此处(00483E18)往上看汇编代码,看是哪儿跳到这儿来的!找到00483E18看从哪儿跳来的,我不习惯使用od看,觉得不够清晰,我喜欢使用w32dasm看,在W32Dasm中shift+f12输入00483E18,往上看,一直到上面这儿(为什么到这儿,你可以从00483E18上面的多个跳转分别下断点测试,那些都是显示序列号无效的相关代码) 在00483CC4开始到00483E18都是显示序列号无效的代码,(我们可以切换回OD在00483CC4处双击,写入汇编代码 retn,不执行直接返回,这时你可以重新运行点注册,会什么反应也没有!) 在00483CC4上方显示,调用此call的地址有7个,我们分别在以上7个调用地址前下断点,重新点击注册,看会不会断下!经过测试会在倒数第二个0056204E处断下!在W32Dasm中shift+F12,跳转到0056204E处!往上看代码,到底是谁调用了序列号无效的提示代码! 看到这段代码 其中00561FC3处的call就是序列号算法函数,爆破只需要在OD中把00561FCA处填充NOP代码即可!NOP后,这时点软件中的注册会提示注册成功,但重启软件后,还是只有5个连接数! 以下是去掉连接数及破解版内容 在W32Dasm中我们在00561FC3处点击Call按钮,看哪些地方调用了这个注册算法函数,到这儿 有两处,一处就是0055B9AB,这处是启动软件判断是否注册的,一处是00561FC3,就是我们点注册按钮判断是否注册的!在OD中我们跳到0055B9AB处,把下面的je代码NOP掉,然后保存修改的文件,就OK了!至于算法,分析太麻烦了,有兴趣自己折腾!爆破后没有5个用户连接数限制,以下是10个连接数图! 后话:因为前面分析中看到有7处调用了,序列号无效的函数,我们这儿只修改了两处,所以如果你使用中存在提示序列号无效的问题,那就需要在另外5处也用相同的方法进行修改!只修改两处,使用中暂没发现有什么问题! 按上面分析修改好两处的成品下载 链接:https://pan.baidu.com/s/1gg9jHa7 密码:sbrw 解压密码 bnwin.com

delphi在ring3阻止文件删除(8圈桌面广告图标生成原理)

8圈网管计费系统,最近在桌面生成图标,直接删除会提示服务和应用管理程序已经打开,无法删除,8圈计费系统先生成url快捷图标,然后打开这个快捷方式取得句柄,再使用DuplicateHandle复制句柄丢给系统进程services.exe,达到占用文件,删除8圈桌面图标就不行了!8圈桌面图标阻止删除的方法关键地方就是使用了DuplicateHandle这个API,看看下面的代码! 12345678910111213141516171819202122232425262728293031323334353637383940414243function EnabledDebugPrivilege(const bEnabled: Boolean): Boolean;//提权varhToken: THandle;tp: TOKEN_PRIVILEGES;a: DWORD;constSE_DEBUG_NAME = 'SeDebugPrivilege';beginResult := False;if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) thenbegintp.PrivilegeCount := 1;LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);if bEnabled thentp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLEDelsetp.Privileges[0].Attributes := 0;a := 0;AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);Result := GetLastError = ERROR_SUCCESS;CloseHandle(hToken);end;end; function DupFile(FileName:String;PID:Cardinal):Boolean;varhFile,hProcess,hTarget:THandle;beginResult := False;EnabledDebugPrivilege(True);hProcess := OpenProcess(PROCESS_DUP_HANDLE, False, PID);Tryif hProcess <> 0 thenbeginhFile := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, Create_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);if hFile = INVALID_HANDLE_VALUE then Exit;Result := DuplicateHandle(GetCurrentProcess(), hFile, hProcess, @hTarget,0, False, DUPLICATE_SAME_ACCESS or DUPLICATE_CLOSE_SOURCE);end;FinallyCloseHandle(hProcess);End;end; 8圈在桌面生成图标就是利用上面的原理!实际改一下就是这样 123456789101112131415161718192021222324252627282930313233343536procedure TForm1.btn2Click(Sender: TObject); function GetPid(ExeFileName: string): THandle; //根据进程名返回进程PID const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then begin Result :=FProcessEntry32.th32ProcessID; Break; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end;var fhand:THandle; hProcess,hFile:THandle;begin fhand:=FileOpen(PWideChar(edt1.Text),GENERIC_READ);//取得阻止删除的文件句柄 EnabledDebugPrivilege; hProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetPid('services.exe')); if DuplicateHandle(GetCurrentProcess(), fhand,hProcess, @hFile, 0 ,FALSE, DUPLICATE_SAME_ACCESS) then ShowMessage('文件占坑成功!'); CloseHandle(hProcess);end;

delphi如何根据句柄判断窗口的显示状态?

有时我们取得一个窗口的句柄,需要知道这个窗口是隐藏还是显示状态?或者我们取得窗体的句柄,想隐藏这个窗体或显示这个窗体,该怎么办呢?这时我们需要用到API函数GetWindowLong或者GetWindowInfo, GetWindowLong的函数原型LONG GetWindowLong( HWND hWnd,int nIndex )参数:hWnd:指定窗口的句柄nIndex:需要获得的信息的类型值 功能nIndex取值如下:GWL_EXSTYLE 得到扩展的窗口风格GWL_STYLE 得到窗口风格GWL_WNDPROC 得到窗口回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用GWL_HINSTANCE 得到应用程序运行实例的句柄GWL_HWNDPARENT 得到父窗口的句柄GWL_ID 得到窗口的标识符GWL_USERDATA 得到和窗口相关联的32位的值(每一个窗口都有一个有意留给创建窗口的应用程序是用的32位的值)当hWnd标识一个对话框时可以使用下面的值Value ActionDWL_DLGPROC 得到对话框回调函数的地址,或者句柄。得到后必须使用CallWindowProc函数来调用DWL_MSGRESULT 得到对话框回调函数中消息处理过程的返回值DWL_USER 得到额外的应用程序私有信息,如一些句柄和指针等返回值:成功时,返回一个请求的32位的值失败时,返回0,可以使用GetLastError来取得错误信息 示例1: 12345long nStyle = ::GetWindowLong(hWnd, GWL_STYLE); // hWnd是一个编辑框的句柄if(nStyle & ES_PASSWORD){AfxMessageBox(“这是一个密码域”);} 示例2: 1234LONG GetWindowLong(HWND hWnd, // handle of windowint nIndex // offset of value to retrieve); 第二个参数是0的话,就是指定GW_HWNDFIRST!!!GW_HWNDFIRST = 0; {同级别 Z 序最上}GW_HWNDLAST = 1; {同级别 Z 序最下}GW_HWNDNEXT = 2; {同级别 Z 序之下}GW_HWNDPREV = 3; {同级别 Z 序之上}GW_OWNER = 4; {属主窗口}GW_CHILD = 5; {子窗口中的最上} GetWindowInfo函数原型 BOOL WINAPI GetWindowInfo(__in HWND hwnd,__inout PWINDOWINFO pwi); 参数hwnd 要检索信息的窗口的句柄。pwi 指向一个接收信息的 PWINDOWINFO 结构,注意,在调用该函数之前必须设置 cbSize 成员为sizeof(WINDOWINFO)。]

如何取得淘宝视频MP4文件下载地址?

淘宝上的商品介绍视频,其他网站直接点击链接播放,很大机率会播放失败,或者你为了下载淘宝上的视频,很大机率直接下载会失败?如何取得淘宝视频MP4的下载地址呢? 用chrome谷歌内核的浏览器打开淘宝有视频的网址,通过审查无素,在审查元素中搜索.swf字符,找到淘宝视频的播放链接! 也可以直接在在淘宝视频界面,戳右下角分享,点击Flash地址完成复制 链接象这种形式的 http://cloud.video.taobao.com/play/u/316952117/e/1/t/1/p/1/19950426.swf 直接把e/1改成e/6,swf改成mp4就可以下载了,修改结果http://cloud.video.taobao.com/play/u/316952117/e/6/t/1/p/1/19950426.mp4 链接象这种形式的 http://vodcdn.video.taobao.com/player/ugc/tb_ugc_bytes_core_player_loader.swf?version=1.0.20170327&vid=50000874445&uid=716884746&p=1&t=1&rid=https%3A%2F%2Fitem.taobao.com%2Fitem.htm%3Fspm%3Da230r.1.14.12.234d5249NdX2ye%26id%3D541265983680%26ns%3D1%26abbucket%3D1&random=6666 进行拼接 这个链接中的 vid=50000874445&uid=716884746 取uid修改http://cloud.video.taobao.com/play/u/716884746/e/6/t/1/p/1/50000874445.mp4后面的值,就可以下载淘宝视频了!

delphi中如何设置dcef3的代理服务器setproxy?

代理服务器(Proxy Server)是一种重要的服务器安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用。代理服务器大多被用来连接INTERNET(国际互联网)和Local Area Network(局域网)。delphi中的tChromium控件dcef3如何设置代理服务器呢? delphi中webbrowser设置代理服务器是这样的!1234567891011121314151617{------------------------------------------------------------------------------- 过程名: SetProcessProxy 作者: kelei 日期: 2013.08.03 参数: aProxyServer代理服务器; aProxyPort代理服务器端口 返回值: True设置成功 SetProcessProxy('127.0.0.1', 80);-------------------------------------------------------------------------------}function SetProcessProxy(const aProxyServer: string; const aProxyPort: Integer): Boolean;var vProxyInfo: TInternetProxyInfo;begin vProxyInfo.dwAccessType := INTERNET_OPEN_TYPE_PROXY; vProxyInfo.lpszProxy := PChar(Format('http=%s:%d', [aProxyServer, aProxyPort])); vProxyInfo.lpszProxyBypass := PChar(''); Result := UrlMkSetSessionOption(INTERNET_OPTION_PROXY, @vProxyInfo, SizeOf(vProxyInfo, 0) = S_OK;end; 在dcef3中如何静态设置代理服务器呢?静态设置方法在dpr中添加启动命令行参数,如果不添加命令行参数设置代理服务器,那么dcef3默认是使用的ie的代理服务器:123456789101112131415161718192021222324procedure AppendCefCmdline(const processType: ustring; const cmd: ICefCommandLine);begin cmd.AppendSwitchWithValue('proxy-server','http://218.189.26.20:8080');//设置http代理服务器 cmd.AppendSwitchWithValue('proxy-server','https://218.189.26.20:8082');//设置https代理服务器 cmd.AppendSwitchWithValue('proxy-server','ftp://218.189.26.20:21');//设置ftp代理服务器 cmd.AppendSwitchWithValue('proxy-server','socks://202.116.0.188:3128')//设置SOCKS代理服务器 cmd.AppendSwitchWithValue('proxy-server','sock4://202.116.0.188:1080')//设置sock4代理服务器 cmd.AppendSwitchWithValue('proxy-server','sock5://202.116.0.188:1081')//设置sock5代理服务器//cmd.AppendSwitchWithValue('proxy-server','direct://')//所有连接不使用代理//cmd.AppendSwitchWithValue('proxy-server','https=127.0.0.1:80;http=socks4://bnwin.com:1080')//同时设置https和sock4代理服务器 cmd.AppendSwitchWithValue('proxy-bypass-list','127.*,192.168.*,10.10.*,193.9.162.*');//不使用代理服务器的地址//cmd.AppendSwitch('--no-proxy-server');//禁止代理服务器//cmd.AppendSwitch('--proxy-auto-detect');//自动检测代理配置//cmd.AppendSwitchWithValue('proxy-pac-url','http://www.bnwinn.com/proxy.pac')//代理使用指定URL中的PAC文件//cmd.AppendSwitch('--winhttp-proxy-resolver');//代理在IE中运行正常,但在chrome中失败,可以添加此flagend; begin CefOnBeforeCommandLineProcessing :=AppendCefCmdline; //指定dcef启动命令行 Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run;end. 在dcef3中如何动态设置代理服务器setproxy?前面已经说过,如果不在命令行中设置代理服务器,那么dcef是默认使用的ie代理服务器,要想动态设置代理服务器,我们不在dcef的命令行参数设置代理,然后使用开头的动态设置ie代理服务器的代码,dcef3的代理服务器就是动态的了! 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556System network settingsThe Chromium network stack uses the system network settings so that users and administrators can control the network settings of all applications easily. The network settings include:proxy settingsSSL/TLS settingscertificate revocation check settingscertificate and private key storesSo far this design decision has worked well. The only network settings that some users ask for an alternative to system settings are proxy settings. For this we recently added some command-line options that allow you to run Chromium with custom proxy settings.Preference service for network settingsAlthough the system network settings have been sufficient for our network stack, eventually there will be some configuration settings specific to our network stack, so we need to have our own preference service for those settings. See also issue 266, in which some Firefox users demand that we not use the WinInet proxy settings (the de facto system proxy settings on Windows).Command-line options for proxy settingsChrome supports the following proxy-related command line arguments:–no-proxy-serverThis tells Chrome not to use a Proxy. It overrides any other proxy settings provided.–proxy-auto-detectThis tells Chrome to try and automatically detect your proxy configuration. This flag is ignored if –proxy-server is also provided.–proxy-server==[:][;…] | [:] | “direct://”This tells Chrome to use a custom proxy configuration. You can specify a custom proxy configuration in three ways:1) By providing a semi-colon-separated mapping of list scheme to url/port pairs.For example, you can specify:–proxy-server=”http=foopy:80;ftp=foopy2″to use HTTP proxy “foopy:80” for http URLs and HTTP proxy “foopy2:80″ for ftp URLs.2) By providing a single uri with optional port to use for all URLs.For example:–proxy-server=”foopy:8080”will use the proxy at foopy:8080 for all traffic.3) By using the special “direct://” value.–proxy-server=”direct://” will cause all connections to not use a proxy.–proxy-bypass-list=(|)[:][;…]This tells chrome to bypass any specified proxy for the given semi-colon-separated list of hosts. This flag must be used (or rather, only has an effect) in tandem with –proxy-server.Note that trailing-domain matching doesn’t require “.” separators so “*google.com” will match “igoogle.com” for example.For example,–proxy-server=”foopy:8080″ –proxy-bypass-list=”*.google.com;*foo.com;127.0.0.1:8080″will use the proxy server “foopy” on port 8080 for all hosts except those pointing to *.google.com, those pointing to *foo.com and those pointing to localhost on port 8080.igoogle.com requests would still be proxied. ifoo.com requests would not be proxied since *foo, not *.foo was specified.–proxy-pac-url=This tells Chrome to use the PAC file at the specified URL.For example,–proxy-pac-url=”http://wpad/windows.pac”will tell Chrome to resolve proxy information for URL requests using the windows.pac file.