分类: 文章

aardio中electron怎么实现窗体透明背景?

electron中的实现方法在electron中实现窗体背景透明,只需在BrowserWindow时指定参数123456789101112mainWindow = new BrowserWindow({ height: 960, width: 1820, transparent: true, resizable: false, frame: false, webPreferences: { devTools: false, nodeIntegration: true, enablemotemodule: true }}) 然后设置网页的body背景色body{background:#ffffff00}和mainWindow.setIgnoreMouseEvents(true)并且需要开启aero主题! aardio中实现aardio中作者在electron.app的288行中,指定了backgroundColor=’#ffffff’;如果只按照electron中设置窗体背景透明是无效的(这个问题一度让我觉得aardio中的electron无法实现窗体背景透明,后来看了electron.app才发现这个设置),需要同时设置backgroundColor,在electon设置如下参数,就可以在aardio调用electron,而实现窗体背景透明,这样aardio就可以愉快地使用electron!毕竟很多html5的页面只有electron才正常显示!1234567891011121314151617181920212223242526theApp.start( //electron打开的第一个页面,必须指定应用程序目录下的aardio代码文件 indexUrl ="/res/main.html"; browserWindow = { title="electron程序标题"; transparent=true;//设置背景透明 resizable=false;//禁止改变大小 frame=false;//设置无边框窗口 backgroundColor=0;//设置背景颜色透明 icon="/wbc.ico";//指定图标 webPreferences = { //devTools = false;//禁止调试窗口 nodeIntegration=true;//允许使用nodejs enablemotemodule=true; webviewTag=true } } /* 可选用args字段指定Chrome命令行参数, 必须在main.js中创建窗口以前就导入aardio模块才会生效 */ args ={ icon="./wbc.ico" }); 最新版aardio,作者已经改进了,不用设置backgroundColor,直接设置transparent为true就可以设置背景透明了! 同时作者倡导的import electron.runtime;如果运行程序时没有electron,自动下载,但写的程序,使用者根本不想等待下载,所以正常应该在创建electron时事先指定下好的electron,打包后让使用者只下载一次。如把electron下载好后,放在程序目录,创建electron就这样 1var theApp = electron.app(,".\electron\electron.exe"); 当然你可以把electron.exe改成其他名字,如electron.dll,上面也相应的改动就行! 另一个问题,electron必须使用aardio提供的,应该改动过,不然aardio和electron无法进行交互!下面是使用aardio中的electron实现的赛博朋克的网页做为主界面的效果

dcef4允许flash直接运行 cef3 84.4.1 Chromium 84.0.4147.105(直接启用不用点击)

问题出现chrome69版本开始禁用FLASH,cef3 84.4.1 Chromium 84.0.4147.105 如果正常开启FLASH,并且不用点击一点运行插件,就象之前版本一样呢?CEF4Delphi是在Delphi 10.2 Tokyo上开发和测试的,已经在Delphi 7,Delphi XE和Delphi 10中测试过了。有关CEF4Delphi的更多信息,请访问: https://www.briskbard.com/index.php?lang=en&pageid=cef论坛:https://www.briskbard.com/forum DELPHI代码实现 找到flash的dll文件 如在360浏览器中拷出flash文件PepperFlash NativeFlash放在程序目录 添加flash文件地址 123456789101112131415161718procedure CreateGlobalCEFApp;begin GlobalCEFApp := TCefApplication.Create; GlobalCEFApp.LogFile := 'debug.log'; GlobalCEFApp.LogSeverity := LOGSEVERITY_DISABLE;// LOGSEVERITY_INFO; 禁止日志文件 GlobalCEFApp.cache := 'User Data'; //设置缓存目录 GlobalCEFApp.UserDataPath := 'User Data'; GlobalCEFApp.LocalesRequired := 'zh-CN'; //设置语言 GlobalCEFApp.Locale := 'zh-CN'; GlobalCEFApp.UserAgent := 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'; //设置全局agent为手机 GlobalCEFApp.FlashEnabled := true; //允许系统falsh GlobalCEFApp.AddCustomCommandLine('--ppapi-flash-path', 'PepperFlash\pepflashplayer.dll'); //指定flash GlobalCEFApp.AddCustomCommandLine('enable-npapi'); GlobalCEFApp.AddCustomCommandLine('load-plugin', 'NativeFlash\NPSWF32.dll'); GlobalCEFApp.AddCustomCommandLine('ssl-version-min','ssl3'); //指定ssl GlobalCEFApp.AddCustomCommandLine('--allow-running-insecure-content'); //允许https网站调用http的js GlobalCEFApp.EnablePrintPreview := True; //允许打印预览end; chromium启动时添加如下代码 123chromium1.AlwaysAuthorizePlugins := true;chromium1.AllowOutdatedPlugins := true;chromium1.RunAllFlashInAllowMode := true; 附加说明其中flash路径也可以使用dcef4的参数CustomFlashPath, 1GlobalCEFApp.CustomFlashPath := ExtractFilePath(Application.ExeName);

CefSharp.84.4.1_支持Mp4包括X86和64

CefSharp84.4.1支持MP4,包括32位和64位_dcef4 84.4.1 cefsharp 支持mp3,mp4,H.264播放视频 版本:84.4.10 包含x64与x86 cef.redist.x64.84.4.1 cef.redist.x86.84.4.1 链接: 链接: https://pan.baidu.com/s/15lndNobZJ3mER2KVHgMTiA 提取码: ygga 使用方法 首先nuget安装cefsharp 84.4.10 安装完成后使用下载得到的文件中的【cef.redist.x64.84.4.1】、【cef.redist.x86.84.4.1】两个文件夹 替换【packages】原本的文件即可 测试站点http://html5test.com/ 百度网盘那蜗牛速度,下这200多M需要一个小时,现提供一个微云下载地址 链接:https://share.weiyun.com/Ue1izExT 密码:ecf6zi 就这东西,到处要积分下载!!!! 对应cef 84.4.1的dcef3开源地址: https://github.com/salvadordf/CEF4Delphi/tree/84.0.4147.105

爬取最新QQ音乐下载地址分析

爬取最新QQ音乐下载地址分析以下均以歌名 不要说话 分析 通过音乐名字搜索 12345678910111213'qq' => [ 'method' => 'GET', 'url' => 'http://c.y.qq.com/soso/fcgi-bin/client_search_cp', 'referer' => 'http://m.y.qq.com', 'proxy' => false, 'body' => [ 'w' => $query, 'p' => $page, 'n' => 10, 'format' => 'json' ], 'user-agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'] 即组成 http://c.y.qq.com/soso/fcgi-bin/client_search_cp?w=不要说话&p=1&n=10&format=json 通过定义的useragent通过Get取得的内容如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102{ "code":0, "data":{ "keyword":"不要说话", "priority":0, "qc":[ ], "semantic":{ "curnum":0, "curpage":1, "list":[ ], "totalnum":0 }, "song":{ "curnum":10, "curpage":1, "list":[ { "albumid":35182, "albummid":"000J1pJ50cDCVE", "albumname":"不想放手", "albumname_hilight":"不想放手", "alertid":23, "belongCD":0, "cdIdx":7, "chinesesinger":0, "docid":"14691017891116423173", "grp":[ ], "interval":285, "isonly":0, "lyric":"《时尚先生》电影主题曲", "lyric_hilight":"《时尚先生》电影主题曲", "media_mid":"004cc3OU0GLJHb", "msgid":16, "newStatus":2, "nt":1413023447, "pay":{ "payalbum":0, "payalbumprice":0, "paydownload":1, "payinfo":1, "payplay":0, "paytrackmouth":1, "paytrackprice":200 }, "preview":{ "trybegin":74064, "tryend":102207, "trysize":960887 }, "pubtime":1214755200, "pure":0, "singer":[ { "id":143, "mid":"003Nz2So3XXYek", "name":"陈奕迅", "name_hilight":"陈奕迅" } ], "size128":4566820, "size320":11416753, "sizeape":0, "sizeflac":30255204, "sizeogg":6051718, "songid":9059607, "songmid":"002B2EAA3brD5b", "songname":"不要说话", "songname_hilight":"<em>不要说话</em>", "strMediaMid":"004cc3OU0GLJHb", "stream":1, "switch":16888579, "t":1, "tag":11, "type":0, "ver":0, "vid":"e0011thbfzs" } ], "totalnum":600 }, "tab":0, "taglist":[ ], "totaltime":0, "zhida":{ "chinesesinger":0, "type":0 } }, "message":"", "notice":"", "subcode":0, "time":1632975151, "tips":""} 通过返回的json可以取得歌曲的songmid为 002B2EAA3brD5b 通过歌曲的songmid取得音频信息 1234567891011'qq' => [ 'method' => 'GET', 'url' => 'http://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg', 'referer' => 'http://m.y.qq.com', 'proxy' => false, 'body' => [ 'songmid' => $songid, 'format' => 'json' ], 'user-agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'] 即通过 http://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg?songmid=002B2EAA3brD5b&format=json 和自定义的头,返回的json如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124{ "code":0, "data":[ { "action":{ "alert":21, "icons":8535932, "msgdown":0, "msgfav":0, "msgid":14, "msgpay":6, "msgshare":0, "switch":16888579 }, "aid":0, "album":{ "id":35182, "mid":"000J1pJ50cDCVE", "name":"不想放手", "pmid":"000J1pJ50cDCVE_3", "subtitle":"《时尚先生》电影主题曲", "time_public":"2008-06-30", "title":"不想放手" }, "bpm":66, "data_type":0, "es":"", "file":{ "b_30s":0, "e_30s":60000, "hires_bitdepth":0, "hires_sample":0, "media_mid":"004cc3OU0GLJHb", "size_128mp3":4566820, "size_192aac":6893143, "size_192ogg":6051718, "size_24aac":0, "size_320mp3":11416753, "size_48aac":1733017, "size_96aac":3476533, "size_96ogg":3079411, "size_ape":0, "size_dts":0, "size_flac":30255204, "size_hires":0, "size_try":960887, "try_begin":74064, "try_end":102207, "url":"" }, "fnote":4009, "genre":1, "id":9059607, "index_album":7, "index_cd":0, "interval":285, "isonly":0, "ksong":{ "id":4841, "mid":"000A57lN1qgVTQ" }, "label":"0", "language":0, "mid":"002B2EAA3brD5b", "modify_stamp":0, "mv":{ "id":173498, "name":"", "title":"", "vid":"e0011thbfzs", "vt":0 }, "name":"不要说话", "ov":0, "pay":{ "pay_down":1, "pay_month":1, "pay_play":0, "pay_status":0, "price_album":0, "price_track":200, "time_free":0 }, "sa":0, "singer":[ { "id":143, "mid":"003Nz2So3XXYek", "name":"陈奕迅", "pmid":"", "title":"陈奕迅", "type":0, "uin":0 } ], "status":0, "subtitle":"《时尚先生》电影主题曲", "tid":0, "time_public":"2008-06-30", "title":"不要说话", "trace":"", "type":0, "url":"", "version":0, "volume":{ "gain":-8.178000000000001, "lra":9.406000000000001, "peak":1 } } ], "url":{ "9059607":"ws.stream.qqmusic.qq.com/C100002B2EAA3brD5b.m4a?fromtag=38" }, "url1":{ }, "extra_data":[ ], "joox":0, "joox_login":1, "msgid":0} 通过登录QQ取得guid和uin进而取得vkeyQQ音乐的地址如下: dl.stream.qqmusic.qq.com/C400000QCwge3B6Ad1.m4a?vkey= 6FBECDE68E94D9E5B1F6731C5A8D83AE2DE961466D2CF64694D86F94590B3E27592575D38322394478AFC921DA703B6805A4278DE54344F1&GUID= 1849502645&UIN=1000&fromtag=66其实就是:dl.stream.qqmusic.qq.com/C400$songmid.m4a?vkey=$vkey的值&guid=$guid值&uin=$uin&fromtag=66 guid需要QQ登录后才能取得,uin就是你登录的QQ号,经测试guid和qq号可以任意输出,而不需要登录,仅客户端的VIP歌曲无效根据guid和uin通过https://u.y.qq.com/cgi-bin/musicu.fcg取得vkey,取得过程可以看下面的python代码 python代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677import requestsimport jsonclass QQmusic: def __init__(self): self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'} self.sl = [] self.musicList = [] # 获取页面 def getPage(self,url,headers): res = requests.get(url,headers = headers) res.encoding = 'utf-8' return res # 获取音乐songmid def getSongmid(self): num = int(input('请输入获取条数:')) # num = 20 #name = input('请输入歌名或歌手:') name = '张学友' url = 'http://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=%d&w=%s'%(num,name) # 搜索音乐 res = self.getPage(url,headers=self.headers) print(res.text) html = res.text html = html[9:] html = html[:-1] # 获取songmid js = json.loads(html) songlist = js['data']['song']['list'] for song in songlist: print(song) songmid = song['songmid'] name = song['songname'] self.sl.append((name,songmid)) print('获取成功songmid') # 获取音乐资源,guid是登录后才能获取,nin也是 def getVkey(self): guid = 7347620869 #guid = input('请输入guid:') #经过测试不用登录也能获取vkey,但限制仅能客户端播放的除外 uin = 0 #input('请输入uin:') for s in self.sl: print('开始获取资源') # 获取vkey,purl name = s[0] songmid = s[1] keyUrl = 'http://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":"%s"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"%s","songmid":["%s"],"uin":"%s"}},"comm":{"uin":%s}}'%(guid,guid,songmid,uin,uin) res = self.getPage(keyUrl,headers=self.headers) print(res.text) html = res.text keyjs = json.loads(html) purl = keyjs['req_0']['data']['midurlinfo'][0]['purl'] if len(purl)==0 : #仅限客户端播放的音乐purl会为空 continue # 拼凑资源url url = 'http://dl.stream.qqmusic.qq.com/' + purl self.musicList.append((name,url)) print('资源地址获取成功') # 下载音乐 def downloadMusic(self): for m in self.musicList: url = m[1] res = self.getPage(url,headers=self.headers) music = res.content name = m[0] + '.mp3' with open(name, 'wb') as f: f.write(music) print('下载OK') f.closedQQ = QQmusic()QQ.getSongmid()QQ.getVkey()QQ.downloadMusic()

纯js美化alert弹出窗口

纯js实现自定义弹窗,美化alert窗口众所周知,浏览器自带的原生弹窗很不美观,而且功能比较单一,绝大部分时候我们都会按照设计图自定义弹窗或者直接使用注入layer的弹窗等等。前段时间在慕课网上看到了一个自定义弹窗的实现,自己顺便就学习尝试写了下,下面是主要的实现代码并添加了比较详细的注释,分享出来供大家参考。(代码用了ES6部分写法如需兼容低版本浏览器请把相关代码转成es5写法,后面有时间更新为一个兼容性较好的es5版本) HTML部分:(没什么内容 放置一个按钮调用函数,js中调用实例即可供参考) 1234567891011121314151617181920212223242526272829303132<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>自定义弹窗</title> <link rel="stylesheet" href="alert.css"></head><body> <button>Click me</button> <script src="index.js"></script> <script> document.querySelector("button").addEventListener("click",()=>{ new $Msg({ content:"我的自定义弹窗好了", type:"success", cancle:function(){ let cancle = new $Msg({ content:"我是取消后的回调" }) }, confirm:function(){ new $Msg({content:"我是确定后的回调"}) } }) }) </script></body></html> 样式部分:也放出来供参考,样式可以根据自己的设计图自行更改即可 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132/* 弹出框最外层 */.msg__wrap { position: fixed; top: 50%; left: 50%; z-index: 10; transition: all .3s; transform: translate(-50%, -50%) scale(0, 0); max-width: 50%; background: #fff; box-shadow: 0 0 10px #eee; font-size: 10px; } /* 弹出框头部 */ .msg__wrap .msg-header { padding: 10px 10px 0 10px; font-size: 1.8em; } .msg__wrap .msg-header .msg-header-close-button { float: right; cursor: pointer; } /* 弹出框中部 */ .msg__wrap .msg-body { padding: 10px 10px 10px 10px; display: flex; } /* 图标 */ .msg__wrap .msg-body .msg-body-icon{ width: 80px; } .msg__wrap .msg-body .msg-body-icon div{ width: 45px; height: 45px; margin: 0 auto; line-height: 45px; color: #fff; border-radius: 50% 50%; font-size: 2em; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-success{ background: #32a323; text-align: center; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-success::after{ content: "成"; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-wrong{ background: #ff8080; text-align: center; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-wrong::after{ content: "误"; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-info{ background: #80b7ff; text-align: center; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-info::after{ content: "注"; } /* 内容 */ .msg__wrap .msg-body .msg-body-content{ min-width: 200px; font-size: 1.5em; word-break: break-all; display: flex; align-items: center; padding-left: 10px; box-sizing: border-box; } /* 弹出框底部 */ .msg__wrap .msg-footer { padding: 0 10px 10px 10px; display: flex; flex-direction: row-reverse; } .msg__wrap .msg-footer .msg-footer-btn { width: 50px; height: 30px; border: 0 none; color: #fff; outline: none; font-size: 1em; border-radius: 2px; margin-left: 5px; cursor: pointer; } .msg__wrap .msg-footer .msg-footer-cancel-button{ background-color: #ff3b3b; } .msg__wrap .msg-footer .msg-footer-cancel-button:active{ background-color: #ff6f6f; } .msg__wrap .msg-footer .msg-footer-confirm-button{ background-color: #4896f0; } .msg__wrap .msg-footer .msg-footer-confirm-button:active{ background-color: #1d5fac; } /* 遮罩层 */ .msg__overlay { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 5; background-color: rgba(0, 0, 0, .4); transition: all .3s; opacity: 0; } JS部分:下面是最主要的部分,js方法及交互。自己封装自定义组件均可以此为参考,封装自己的组件。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208/* *自定义弹窗 *///自执行函数 形成封闭的作用域 避免全局污染 //传入windwo和document对象 相当于将window和document作为了作用域中的局部变量,//就不需要内部函数沿着作用域链再查找到最顶层的window 提高运行效率。(function (window, document) { //定义一个构造函数Msg 作为弹窗实例的构造函数。 let Msg = function (options) { //执行初始化操作 this._init(options); } //定义初始化方法 并对方法传递的参数进行初始化 Msg.prototype = { _init({ content = "", //文本内容 type = "info", //信息类型 useHTML = false, //是否解析html字符串 showIcon = true, //是否展示弹窗图标 confirm = null, //确认后得回调 cancle = null, //取消后得回调 footer = true, //是否显示底部的确认按钮 header = true, //是否显示头部信息及关闭按钮 title = "提示", //弹窗标题 contentStyle = {}, //内容样式 contentFontSize = "1.5em", //内容字体大小 btnName = ["确定", "取消"] //按钮文字内容 }) { //将传入的值绑定到this上 this.content = content; this.type = type; this.useHTML = useHTML; this.showIcon = showIcon; this.confirm = confirm; this.cancle = cancle; this.footer = footer; this.header = header; this.title = title; this.contentStyle = contentStyle; this.contentFontSize = contentFontSize; this.btnName = btnName; //执行创建元素方法 this._creatElement(); //显示弹窗及遮罩 this._show({ el: this._el, overlay: this._overlay }); //绑定事件处理函数 this._bind({ el: this._el, overlay: this._overlay }); }, //创建弹窗元素方法 _creatElement() { //创建最外层得包裹元素 let wrap = document.createElement("div"); wrap.className = "msg__wrap"; //定义弹窗得两个按钮 const [confirmBtnName, cancelBtnName] = this.btnName; //判断是否显示弹窗标题 const headerHTML = this.header ? `<div class="msg-header"> <span>${this.title}</span> <span class="msg-header-close-button">×</span> </div>` : ""; //判断是否显示图标 const iconHTML = this.showIcon ? `<div class="msg-body-icon"> <div class="msg-body-icon-${this.type}"></div> </div>` : ""; //判断是否显示弹窗底部按钮 const footerHTML = this.footer ? `<div class="msg-footer"> <button class="msg-footer-btn msg-footer-cancel-button">${cancelBtnName}</button> <button class="msg-footer-btn msg-footer-confirm-button">${confirmBtnName}</button> </div>` : ""; //拼接完整html const innerHTML = `${headerHTML} <div class="msg-body"> ${iconHTML} <div class="msg-body-content"></div> </div> ${footerHTML}`; //将拼接的html赋值到wrap中 wrap.innerHTML = innerHTML; //把自定义的样式进行合并 const contentStyle = { fontSize: this.contentFontSize, ...this.contentStyle } //获取内容所属DOM let content = wrap.querySelector(".msg-body .msg-body-content"); //将传过来的样式添加到contentDOM for (const key in contentStyle) { if (contentStyle.hasOwnProperty(key)) { content.style[key] = contentStyle[key]; } } //给弹窗的conntent赋值 if (this.useHTML) { content.innerHTML = this.content; } else { content.innerText = this.content; } //创建遮罩层 let overlay = document.createElement("div"); overlay.className = "msg__overlay"; //把dom挂载到当前实例上 this._overlay = overlay; this._el = wrap; }, //弹窗展现方法 _show({ el, overlay }) { //把弹窗的dom和遮罩插入到页面中 document.body.appendChild(el); document.body.appendChild(overlay); //将弹窗显示出来 timeout进行异步处理显示动画 setTimeout(() => { el.style.transform = "translate(-50%,-50%) scale(1,1)"; overlay.style.opacity = "1"; }) }, //关闭弹窗方法 _close({ el, overlay }) { //隐藏dom el.style.transform = "translate(-50%,-50%) scale(0,0)"; overlay.style.opcity = "0"; //根据动画时间 动画完成再移除 setTimeout(() => { //把弹窗的dom和遮罩移除 document.body.removeChild(el) document.body.removeChild(overlay); }, 300); }, //事件处理函数,为DOM绑定事件 _bind({ el, overlay }) { //保存当前this //const _this = this; const cancle = (e) => { this.cancle && this.cancle.call(this, e); //隐藏弹窗 //hideMsg(); this._close({ el, overlay }); } //确认弹窗 const confirm = (e) => { this.confirm && this.confirm.call(this, e); this._close({ el, overlay }); } //顶部关闭按钮绑定事件 if (this.header) { el.querySelector(".msg-header-close-button").addEventListener("click", cancle); } //弹窗底部两个按钮事件监听 if (this.footer) { el.querySelector(".msg-footer-cancel-button").addEventListener("click", cancle); el.querySelector(".msg-footer-confirm-button").addEventListener("click", confirm) } } } //将构造函数暴露到window 可直接在全局作用域中访问构造函数 window.$Msg = Msg;})(window, document); 到此,一个完整的自定义弹窗组件已完成,只需要引入该js以及css或者直接把相关代码加到自己的公共js中即可直接调用,注意,构造函数调用要用new. 转自https://www.cnblogs.com/websharehome/p/9438741.html

Delphi实现类似Android锁屏的密码锁控件

手机锁屏之后,开屏的时候,要求咱们输入密码的那个滑动效果输入的控件。 Android的那个锁屏的效果,用过的人应该都知道是个什么效果,也就是横竖各3行,排列成九宫格的效果,然后由用户在上面滑动以此来达到密码输入进而进行解锁和加密的效果。那么首先,俺们可以分析一下,他的具体形成思路,实际上是很简单的,就是一个排列,然后根据滑动产生的内容形成密码来达到解密的目的,那么最主要的就是这个密码和他本身的密码是如何对应解密的,实际上很简单,咱们给他排列的九宫格,都固定好位置 1 2 34 5 67 8 9 就像这样,排列的给他的位置固定好,然后每一个格子表示一个字符或者说字符串,进而用户滑动的时候,将对应的位置序列进入到一个列表中去保存,然后鼠标放开的时候,那么入队的选择位置进行组合,那么就是对应的密码了,比如 这样的输入就是表示123,如此顺序记录,就可以形成密码了,然后用户进行滑屏录入之后和以前的进行比较就可以知道密码是否正确了,当然我这个组合是相当简单的,如果想要整的复杂,可以给每个顺序位置给定复杂的字符串,这样形成的密码就足够的复杂了!给一般人去看,也是看不明白的。 那么分析清楚了,思路也就简单了,鼠标按下的时候,开始可以滑动形成密码,鼠标按下的第一个点,作为队列的第一个,然后再滑过的就顺序的一一的记录到队列中,鼠标放开的时候,从队列中获取各个顺序位置,组合形成密码然后和原密码比对,判断密码是否正确!源码如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313{ Delphi实现的类似Android鼠标锁屏效果的控件 作者:不得闲 2012-7-23}unit AndroidLockControl;interfaceuses Windows,Classes,SysUtils,Graphics,Controls;type TDxLockItem = class private r: TRect; IsEnter: Boolean; IsChecked: Boolean; Value: AnsiChar; FRadio: TPoint; public constructor Create; end; TInPutPwdEvent = procedure(Sender: TObject;InputPwd: string) of object; TDxAndroidLock = class(TGraphicControl) private FItemSpace: Integer; FRowCount: Integer; FColCount: Integer; FItemRaidio: Integer; Items: TList; FUseNum: Boolean; FPassword: string; IsDown: Boolean; LastInItem: TDxLockItem; PwdItems: TList; FOnInputPwd: TInPutPwdEvent; procedure SetItemSpace(const Value: Integer); procedure SetItemRaidio(const Value: Integer); procedure SetUseNum(const Value: Boolean); protected procedure paint;override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure CalcItemRects; public constructor Create(AOwner: TComponent);override; destructor Destroy;override; property Password: string read FPassword write FPassWord; published property ItemSpace: Integer read FItemSpace write SetItemSpace default 10; property OnInputPwd: TInPutPwdEvent read FOnInputPwd write FOnInputPwd; property ItemRaidio: Integer read FItemRaidio write SetItemRaidio default 20; property UseNum: Boolean read FUseNum write SetUseNum; end;implementationuses pngimage;{$R LockRc.RES}var PngIn,PngOut: TPngImage;{ TDxAndroidLock }procedure TDxAndroidLock.CalcItemRects;var i,j: Integer; p: TPoint; r: TRect; item: TDxLockItem;begin p.Y := FItemRaidio; for i := 1 to 3 do begin p.X := FItemRaidio; r.Left := p.X - FItemRaidio;r.Top := p.Y - FItemRaidio; r.Right := p.x + FItemRaidio;r.Bottom := p.Y + FItemRaidio; for j := 1 to 3 do begin item := Items[3*(i-1)+j - 1]; item.Value := AnsiChar(3*(i-1)+j+48); item.FRadio := p; item.r := r; p.X := p.X + FItemRaidio * 2 + FItemSpace; r.Left := p.X - FItemRaidio;r.Right := p.X + FItemRaidio; end; p.Y := p.Y + FItemRaidio * 2 + FItemSpace; end;end;constructor TDxAndroidLock.create(AOwner: TComponent);var i: Integer;begin inherited; LastInItem := nil; PwdItems := TList.Create; FPassWord := ''; Items := TList.Create; FItemSpace := 10; FRowCount := 3; FColCount := 3; FItemRaidio := 20; Width := FItemRaidio * 2 * 3 + FItemSpace * 2; Height := FItemRaidio * 2 * 3 + FItemSpace * 2; for i := 0 to 8 do begin Items.Add(TDxLockItem.Create); end; CalcItemRects;end;destructor TDxAndroidLock.Destroy;begin while Items.Count > 0 do begin TDxLockItem(Items[Items.Count - 1]).Free; Items.Delete(Items.Count - 1); end; PwdItems.Free; inherited;end;procedure TDxAndroidLock.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin IsDown := Button = mbLeft; if IsDown then begin if LastInItem <> nil then begin LastInItem.IsChecked := IsDown; PwdItems.Add(LastInItem); end; Invalidate; end;end;procedure TDxAndroidLock.MouseMove(Shift: TShiftState; X, Y: Integer);var i: Integer; p: TPoint; OldInItem,Item: TDxLockItem;begin OldInItem := LastInItem; p := Point(x,y); LastInItem := nil; for i := 0 to items.Count - 1 do begin item := Items[i]; if PtInRect(Item.r,p) then begin LastInItem := Item; LastInItem.IsEnter := True; LastInItem.IsChecked := IsDown; Break; end; end; if LastInItem <> OldInItem then begin if OldInItem <> nil then OldInItem.IsEnter := False; if IsDown then begin if LastInItem <> nil then begin PwdItems.Add(LastInItem); end; Invalidate; end; end;end;procedure TDxAndroidLock.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var i: Integer; item: TDxLockItem; Np: string;begin IsDown := False; for i := 0 to items.Count - 1 do begin item := Items[i]; item.IsChecked := False; end; for i := 0 to PwdItems.Count - 1 do Np := Np + TDxLockItem(PwdItems[i]).Value; PwdItems.Clear; Invalidate; if Assigned(FOnInputPwd) then FOnInputPwd(self,Np);end;procedure DrawLineArrow(canvas: TCanvas; p1, p2: TPoint);const l = 6; //箭头长度 w = 4; //箭头宽度var slope, angle: Double; points: array[0..2] of TPoint; Xl,b: Single;begin canvas.Brush.Color := canvas.Pen.Color; canvas.Brush.Style := bsSolid; canvas.MoveTo(p1.X,p1.Y); canvas.LineTo(p2.X,p2.Y); if (p2.Y <> p1.Y) and (P2.X <> p1.X) then begin xl := (P2.Y - p1.Y) / (P2.X - p1.X); b := p2.Y - xl * p2.X; p2.X := (p2.X - p1.X) div 2 + p1.X; p2.Y := Trunc(p2.X * xl + b); end else if p2.Y = p1.Y then p2.X := (p2.X - p1.X) div 2 + p1.X else P2.Y := (p2.Y - p1.Y) div 2 + p1.Y;//画箭头 points[0] := Point(p2.x, p2.y);//箭头顶点 if (p2.x - p1.x = 0) then begin //垂直 if (p2.y - p1.y > 0) then slope := -1 else slope := 1; points[1] := Point(p2.x - w, p2.y + Trunc(l * slope)); points[2] := Point(p2.x + w, p2.y + Trunc(l * slope)); end else begin //倾斜 slope := (p2.y - p1.y) / (p2.x - p1.x); angle := ArcTan(slope); if (p2.x - p1.x > 0) then angle := angle - PI; points[1] := Point(p2.x + trunc(l * cos(angle) - w * sin(angle)), p2.y + trunc(l * sin(angle) + w * cos(angle))); points[2] := Point(p2.x + Trunc(l * cos(angle) + w * sin(angle)), p2.y + Trunc(l * sin(angle) - w * cos(angle))); end; canvas.Polygon(points);end;procedure TDxAndroidLock.paint;var i: Integer; item,item1: TDxLockItem; r: TRect;begin if not IsDown then begin for i := 0 to Items.Count - 1 do begin item := items[i]; r.Left := item.FRadio.X - 5;r.Right := item.FRadio.X + 5; r.Top := item.FRadio.Y - 5;r.Bottom := item.FRadio.Y + 5; Canvas.Draw(r.Left,r.Top,pngIn); end; end else begin //绘制指向线条 Canvas.Pen.Width := 2; Canvas.Pen.Color := clGreen; for i := 0 to PwdItems.Count - 2 do begin item := PwdItems[i]; item1 := PwdItems[i + 1]; Canvas.MoveTo(item.FRadio.X,item.FRadio.Y); Canvas.LineTo(item1.FRadio.X,item1.FRadio.Y); DrawLineArrow(Canvas,item.FRadio,item1.FRadio); end; for i := 0 to Items.Count - 1 do begin item := items[i]; if item.IsChecked then begin Canvas.Draw(item.r.Left,item.r.Top,pngOut); end; r.Left := item.FRadio.X - 5;r.Right := item.FRadio.X + 5; r.Top := item.FRadio.Y - 5;r.Bottom := item.FRadio.Y + 5; Canvas.Draw(r.Left,r.Top,pngIn); end; end;end;procedure TDxAndroidLock.SetItemRaidio(const Value: Integer);begin FItemRaidio := Value;end;procedure TDxAndroidLock.SetItemSpace(const Value: Integer);begin FItemSpace := Value;end;procedure TDxAndroidLock.SetUseNum(const Value: Boolean);begin FUseNum := Value;end;{ TDxLockItem }constructor TDxLockItem.Create;begin r := Rect(0,0,0,0); IsEnter := False;end;initialization PngIn := TPngImage.Create; PngIn.LoadFromResourceName(Hinstance,'InnerGra'); PngOut := TPngImage.Create; PngOut.LoadFromResourceName(Hinstance,'Outer');finalization PngIn.Free; PngOut.Free;end. 运行之后的效果就是转载自: https://www.cnblogs.com/DxSoft/archive/2012/07/23/2604941.html

多个局域网如何组建成一个局域网互相访问_softether的安装及使用

1af2aaa64b94522a0556bd1ec5c327926c3e53ccd8a5cce18e30a1a06212345c39a0594ac69cb5f1cd1efdccf8f8c467cb00d5665bf4b7596eee3bea313b472f73605f819af6268411d9122ba6b7631c6c3dc2b3288d760da6593fc3ab568204a1c2a685d9c713821606443c4ec7fe09e5a0afca762525fd133d75ebfc1cec126cb3355c673cfa1a780e5f0d79ffbe7845ac5b634edbea8b3255789a2228f6ea620d97584378534e4299ad0a04028479cee9636724a1f0113c8c4cc72eaa794aa31ca5c2b77e3078b297045e2910b55be686d71cf8566edf5abeeda8b26c5c0347bf6c0ecd90d18f311ed2edd963bc0d7fb79adc1da87bd419ca2b7abc12c25db43d1b59860cb53cec064e6eb60931e72f4f14ed8a0a765ca25d8229d2284074bc9556b3fd53a98926df74eee856b77f23c0e3ee43bccde4390666e5441263e5724eae7d3b4b7f140184c12e89fe18190ce2b752abe43c2469a35e5ad8506e7a99f1d2a69fb4b55a24b98391c12261e6c7406deb92827bb78a68346541f90d73efda46e6270535c935fcbd2c76f1c40b554b64f04565f78cb8a55c9f69dc291465a637971e4f95656a6c0a3181ee0316d04d315f76281fc79c7723865fd60eb70bf5184f182af89f09f42c2a4e6a3da4ee7e16b483798559e3c4a8d609038f5b1cc57b17b02f718e6e935878cbf3ec488982e5b2797a8087364539789754217147399a2aae33dac303c263b870118197d583fa1bfa944ed19ff5c66dd758a232d5da51af3c8c19420617d130680793f4988a580f14365b26b680b2d40c78dbfb6e32814ee2d8b4224a9cd773e7281dd89cfec49e33cecf0b547b34cea9135f4f09c3e66549c42f5766a1af954e32673e3f1a123efa57dc909e65e5ded61069d07f2275b5cb9222d8bd560163f40788f558c5b619c1d303c5725bfc5cf3a229932ce353d0b1f4ffce92491e291173a9929d47471260e7eae3ce64be6a645fca513c8a7d5873620fdd3ab74f9529602749ffa068ff7a1302947964d04f13e7a66fdd0e17dda486ef9bde17f0f34a05f26a2918de2b2b847c716fc4aa365ea75b67f836775e442ad03335dc011c46304d480b4f7d66afecf21b947539e6dbbaef8f5995a196dda323c1c2bfa45d2c802683dcbe1e4d1fffb7876241f9b67feca9014c1b3a8183b13dc5ed776b67c2c97d260e6c34155097692f23adecc0cde13ba9f3017c12ace5519cfb9d200f1182e8e6417b6f9f23030aee6f719f72929c6f0aad7f556cad29ef9986fc43b03376137255b7c660cd840609d435e8da6c8ca8e3192c5910b051a08bb04500be85180234b010030d59b1c9d718a571da10647bd6ca327f10df82a1fddfbdf1a485237db8d1d0d7b67b5563eb051fdc6e2ad655165fbd67a075722633d0e4d41458b5ce489cec91dab3b2ed3ba2acd0d9085241fdd9d81268afbc5b2b88e81e6b980081dc108b1759d393bc3742cfa9a6e09c1367e84c4d572b89265de8136a3daf9a8c55967466d74add7f0f39a362f98913c8afd7074da07a6934b98b5d689ab62167aa8f518fdc262dc661a0b49c0d8e7075533af52774b4cbba149008d01ff968ad5817b6499c38f6e726ae9fbbe3655ef9ae25fbc0a0eaa1df45995196275c1a69b657a9e028f5224919e67ed43ba86f77e40b1e94513b1fd31d0059915fe382d06c9fc4836cc69bcb0ec81ee634b757bd2de56d69b386448edfc8ad4b1b2675b31dd3896f5bbdd4df5baf7ac93b2adbead6a7b2e9f99d6f9c496501cafc2cafc5323ed50628e32b9ff2e7adad5c30de93e229e80e8f8fab425d0e76d333e9b0cf6d692ed3db10b79ade834bbe05b9f15e1a75d2bcd8e911a0e484ee5ba8fae2df5a4c4da537c51fbbcf4d767cbfc9b28d7ec0c27b8bc7dffd4e0486a3de69816bda7e08d4c16f5707defc7d67f7ee8f60967be3d282995a1dc9ac80c2167d648344bd4fef7191a3b7396d3be96e8bfa33b79e3149d29e3f2eb7c8288e92257204c198ca0541e578e08c5b61c5123c6d07fd6ba221972a1065c09996d90400cf1a76279e8dbdc9d7a6411ebd303371e714777ba8d7716dda16ee9148a3cc807929585dec72f5a4327f72467214fb637fd82e9877c8c100e106ba731a0937a05a6b7dd3fc431605e1bceff2d00592fa82e912680779a46b583a71b5e50fcc5c856c258e7ba8f45eb9c9cedbd45db959c1dcdc2760bdde45b5c0c7acafaafb30a0d6c624de80b4258d4eb0d9a3eeeebbbe966dbe23e9d23c1ae7499ee4e1f6676961f2e5816a1eaa1fefeef98aaee77b6592fe9d2e4eef0de3019d82bb22abededff90da990749ee279876195991dd5c2132ac6fcd943d95650a72014ba49ff554b67d15885652569162e0278254809de8f14e7e84b55d80f09b351abb454e3d71509f697929ecda17bce4df04874de1316a1a142f07fa0183e7c873577fb985a278e40b7e65fc0d3d6dc20860d50d17a69c56b34b20cfb6e48f214df582c4b4470ecc96e37fc005b138c793012d1a3d4bffce75ada3bfd0d0972d2faa7592405c92bcd5df3477c4b3612cb150d0b88e4fcece0792bdea716f848cd6d0bb587c32267f2eaba9f60172274457c6da177e8e946cc9e873f4dd6a281b4a82e2a90a301fb6bc4d7ac7f618c845b0c705203bd0766681e618c2e39d5bcf344f6d0656bc1e56572fadb50a4aceb9feb9cdba91b2d53a29a93d9a976343bfd9da9a46e768bc12c859207388ce439d98b5dbe488e0104e25844c1a61176d6c1d3d85715fdcf7815fa32097b73d728b1db818de8d14c64128367ce53f4172c4a006e6e335f7d70c1103414843d6c8c157b202b827dd9bd96d86025a95173405816ffac516614ac78399688f172a9dfad10bdf65c929805e7d67f54fb53f416b26bec9baee37798e7966140c6167e8968a0d6dd8d414f99567f9ebf33a7f2daa2cef091d389d97a11113fad0b3ad8dc0aa074a0a6f79f06b33af3638a09c8449544565f83dd733452c3258c1c3668b2b89d0328c740a570f1332db01b85d41bb1452ef947bbe85d0962e3341e9c3771d6205b446628198630092f09daf1c7a44d52c167af42e601070604d92d52c073284c21008d853559a244977fec4ab5e1fb613812a98f1491622bda05726a32ff915a4de22074fb0fbf22a0b324e16a78984eed987ab94cd9ca7493b9873b05152f47058bfc71d9839e58296e3f3fd0cdd456e32eeee26906850654d50b654cfbd1d3d8846099771dc65d8ff0e7cd804a6b55687d15a0195fc79768760b84ffacd89bd95baa4e1e218f10f19acbe27050637cf01f2d8cb635b9a4403260edbacc437af32c387a67a2a2cd772c5e7567d878ec194b1984d559854aed8b133c0bf435f2f906c3f30c9cfa84412f1c8f97ae3b770f2011b6b28662d0c4282d088dffde036a9ad2dae174727a33d21caa06e5caca1ab0346ba4ae336ca7c18b637f2ecb2236d83ebeb1b8e134d112a3da1ed51a42da9032b9805652e6db679acc56b665868378beda2f17766c7a13165283c093ec81fb9cc2f1647940a4850c466fd347f370c43c6c97bbd31483172dfa9998e76124943584603ffcb1c63d151e260a1a36f64e57bb0b5061c0762c3e360b01bd02668d37b793cfdf0413e3148533c6ee3e0120ed4d09596f57b7d94f9a2f2d0e958f7f6348898a47648e36fbacd81844a3c37581d97fec904adee4b79ad20670cad59da21fa60c7dc5cfd9215567761f3984db39bf62814db8649f5574e5b4fbc124892c86cafed6e833ee520a762629fec745d03d838b41f56d97c19da09d5594e278141015e1844b2eef4d4b1c5e2f62b241aa68e391391ebb7d91e82b3a52ec2e421734d029efc368133f4a10a2201198743276ee03a19229be581970683a9d4817f028a72c64bbd7176e9bc389303341ddb352f8fffa277077bd9e47cd818e27128fac0a57be928343490eccd0051a08797e0b57b97443dfaf466c08ef6bccc6db980a4b5926cac219ec6b30d7175f6f21cb97c1827028c10934f1dfcf2b4e2098870b30b1226d178f3e246e0d23ff5a91e294ddce262326cc55ec2b33fb0e9d22ff03f034e60fb6f771a7732ad59e8a63907af1a55492c8b55aa96892fd3c7ff7a67b4030945fdfcf2e3ad13ba0aac112272d1bab54327dee1b158e14f5d2a8195055021a2e3ed64716ca624ca4fd7c17289815c6512f421746ccc760b1f06886120c3d3d601b425b9f3aa97306e7927d73f1cbd41491813a98d0f29691997d72906a94a558d9f05acb0b4ef1b65cb002330826659536b5262a61b4bb920eeaff82d4464705a8682e92964f4782718030034de61829ad8736e2907b4376f2e33ece18dcd9e75fdedb5868afa64b840ca90f74f384335557d87a93421a6cf0fd65c755fa8195e7ec38eae344fc5ce33d6a1eeabe3d30a8969de3c3859ebfe23bf7d749eda08a028c49f6817cc7c9093c430b1c5f41bb66147fceca9dbbd93567ebd30d4eef4dbaab170ffcf942db181b496d8f0a1d0e00c658b6328e99046d503ef65caf2815a40bfd116fe8eb218febe2d6aa9f9d8be8498267325f02913d7d236667ca80b09a2ccd78bed8c061d9d4ef6d3e8610774bf403535728eaa1904570beb963788ee3f8c21fac3835b39a6a7dc6b66137d003f1b2538c0aeb74d8587676e53d125de75db5de1064c35afb1e468a480d418691435f2ad452d735101b6f93c5790a4ac98302e6727548414bdbc36cbb4a737fd5f435f26eed05779419939e4882fdbcfb2ae20f3d70247bfc32847eae5dd71cbddd0198aadecf21e5f7a72a47cd09cc289b8ab70475476af38261920f7085b3ebb4ca3ea40d71809215d5c7096f462db7de4be9fd384a5c4b6612a31c5364263ca6060840e54e3ca29a3438e8d6beef8cf5f44d9b4327a9b57f020cdc480a211d7127731ee128f11d6231758c56aa44c12fb793dead5bd0f9912908b9c0d9dcbb01d1392edb486cec36b6d2a24f2eb1a7cbe7805e0e29081071da7611ee163476c446bf1d79ef16cbbcdba2add10421ecf8bce71e5e0f43e443a4a3b0f2e7d187856fea53eb64292b990fa0d21f8cea79812071b19fd1ff70419a25037e3b63a86edf7e8e39b557842863fa31954d8d8d92a26a21b62e5247a941a9f635781638cf3bdcc2b5f6b3557471d2279dfe96c19a230de7d0eeb6dd7085ebd59d4904b20310c06103106bcfa0ba8c44ebe4fe79ffe3bd8807b556195bfdf63ebb25722ff99e47e7686d2ba82e27997b4f31cf0bbb760e8c97fd6bd8712c829fe44b5a772c4e737a73ef1bfa1446a87351a1e62259226c03b2387b66ac77a59ebbb2ce676a720b23978bc1629700d50f06687fa60d36e9da6d22d1ef3ff10d463e13eb9ee296a11450eceba00da5b31d7c871cb5a98ced52dab57fd7bb1b4eda8142b9593a37d77200df52f9e786dbb3b4cbe87f3c4ba3ee516892c3c92a23d076d02f65e2f171ea0d8b7557358533a84f03478f1eccf91163a8322f6ab9b495eebc23804e95e1027f7758eb68f9cd34b6c1be795d0b4b7d5c1a36a0f8e304af40f740c8820a41a1f9063dce2d02def17b9a68308bd1b9f281e28a06b34e1eecac7acf5a7c50caf39bcd44c3af5e242630e761ece89dc6892ee17802ad56e161f06aafeb08e3fec5030212357d2b5e5ef2ebc36efa9801f5eb19036dbf7a8b5fb911ada0391e41e65c22218eeaf27bd4b783c935d4d2b1699df5ba0bf5ff2a4d792b57b0f0980a37bb37ca0d1fd37c3c7dab30d2ca1994943b2c7a2820adad706693e4791ac0cd500ddf55235c47dd21d6bb60eb557fc21e82fd0b5f635fbda00dc11dd430af293f124452a5f6f1f394e0b6c9c50c935bff6c91da6d3df8d15ac044f71c560a363da8157b1f06b2c26240cd65b1cff50b3a6545fbd59b37d8268c0777534705c29215cf262ddf4a37bad2ccd5fe715be78f34c6126b1e2468827fc2c1a74b113a751f96cd8107f143d514aeb81aa7f54a72ceba9a328afe2f054b2c7100813dbd7865e538cf5074bc3db2f530b5d0d97af080ee1c43186359ef78757f5bea7a5201357a5da09f3aba6cb8330fa6ad4cb6838530ae5aa3df4595c7fa1d0e5d425edf69153815f93a1ab4ad3ddc558c2139cb47585c4824ca4fd5e4f4b396eb4597dce2a5d80bfffef89b7a6524c120d9a433424400d4fa8990f4b4a1a3f09934adb80567b9cf181e83b2080f86c67907e335324d43f51d97e02955e92488f93086edbbb9ef98254fddb9830bbb4f099aa39de590d7c9a9372a4df7989963a38164ff920703f2ba5d142dea9a9041fd066e86a7e65405bc0c7345b3e22edb2854e3c31e4622e2d60baa1bdf19ff072ac279804240458977aa076cb1348c87e2406c12e18da65c12e74dc9396c289c341197181f986c3c089920ee767f6e3638c4c680cbca71c5af1947a7eb385120dccf568cb7bf7a984cf63aa4defd4ac3e850241598ce2b1dad30495d296b7db732cf88b4e2a59be02e36385a97fcbdb6d422b97cd55f82c7a9c285b2212b617939e49ccb5f39d7fe1e220ce4213c7a3a4ade4387e44e6b076ba14e3fcb9ac0cab36c34e99bd97fdd5e5d5659ce056f91f71eb7436d6aa5ec0779d1691f53a61d977da835209b699836f61669eeb33788dda4af3592b406e5b885c178c2769c45d9dc87cfa34e277b659952c1da75dad3a0ff6d912d7dc074a66ef9b9b3161c4cca0c5971e0be41d800c7b314e3c363a293fc71eced3f8f9d43b18b6d6ad7588368fd79f88a1ff77ae619b4ce37f051ecd22637f9557edf5f10bdf2ad33f3c1712a20715b2bb5be04195cc6a7311ad888b975809d20fe98aca88a23cd38be4aea88ae04d912ed426da83c90941862523ea7ab565cc61627f648b57964c56d162a8ef32bee955198ea8476d25273a6a9b3ccf67b088c006e007b8a896629a3a81097f0521a0feef2e22c04372e22bd9c86490b073c6cc5a49c7215828aa480aacd2c0ca07a459eabc8514dcebfe05c5c2a6e8dc7e21e540cef55c3800a217f2faf12caa615f96fc24949e70f41702f90122f91a8a7da3a0f1d4bff7dadaff9f9c66f9ba3d1b970212c214099dd00647cf4539759d540c9a15a534c39c6d1b55c147eac41e5b6962ec866815f36e60749e1fb4197d15a39bf3b1a676863bffebd06a5a31a91fa71a90c86c3a26b4892edfdf5952fb344677e30f2b3f26994dde5b819a5a52e4df435df37a2858394452c19230a3ae6577a76c5aa00904bf78d8c427935050234d8ea1208d0dcdb59b676e982c6a8919cdac76dcaadb5d5de54b4e3f0519786974816ea25c48e256f9d9713a60079fbcfaf8367528d209c8dc73a076af693b2476c02acb2bfdfa563132b97e9dbf72b6d87da445d20007ad8f112d57cc4b13447ba9baf41a4cda397fa167a1788ec103b4ef014e555b4e7fc008a212fccaf24f6c54a6a5b211b8a40d2fc87bb08adc9eefff1e87bb240864e99e685cdf10393ae01cb3ea34cce58cb2fb3f04a742b9aac854c08879212c55c2f9e3041725f921c1e5016ba32c493cfdb0914dc6e2427c9331953178dc03c9b4ec16ab9bffdddd436bdc0fb65c8f9f391ad33a4381cd4b379a10c85eaf49fd1b5d38427273971a1749cd6976eaa00c50c4db83761089b8d30deb8a97375f39cc9f739eeca7380ae41adac7046c3fc3d53d8461c609c4e8dbc53c0df90ba0366b72ba2fa0f4030d7710c6d242f6012e4d6f6bcfce43aa2fe2064f928b27ba2b0875fa924b98b5f6261867d2ffc06b1a58508183a1e4f0fb56d45baaa4fd65bdca6bade63a692a9c1ed39b4ecbfcf31027da5ac7afcdd4461ac4084c81ab72f4edd150c6a3b33932590c7321f3926a5aac81e73f76d1bddc550082626e114d79ce768b37b0c4eafd6b8e20c51508d43212d1aed1ae8d28168b499d51d364e550000575a756bf8650136f8b07bda5bb040d78b60bd7e7e823fad0b0b0cff5fcaa2520b0334f48bd0b6e9d62b0f90b8bc68795fbfb99a97ccaabc51f36bf2b90c513b4a55d883bef12ba44bfc17431e9abde52afd2cf30e9a4f098d39d85d5632592b690324f8e257f59e880b687cb7782bc7aabd3fa038becdc6af066f56985f427d87ba539696e558ad99aecad76bfbf35df4271e9c4ef01bdab8fbdc0200ff9523795627310c89898e80af964d3c47acfa033a3579b4b550170eed3605fc13c3229d3aa04fedf360bf5e60456adc5b2af1043a65615a7ad4268d9342de95762017b7341da38f8983abe731332a737917893d3290fb362b1f5634d2fa4725281ad06341a3a93fa8c5e736e66a5fed01454301a96c335fac3e648a9d8b1e58a750e4191c83dfe4f0972f43564493620143f088d72c1abc6434ee26bf8ec8ed1c0234627047dccb399bcf2e4a378a831067689f2436778512f3c10bda7be51c3d4a486efda20e2554589e3054822ccf8fc141ff1d10df36cd390287963424c47daa5fc7971b257cbce3b0a781ba1d5c91dd89c3ce926ec01f23131f91af0a4e2ab7ef4f461b501ea128565b7867ce7d1909f67c9fcc95dd690ffcbc1fb99546285f2d9249498203fe14d52a0f4c57af41194e98ec60d02cfe8dea508da0741b5f0441880a6d51191a23ae2357874721781c592b2957434bcee304d125dc241c90d9ef25410c782a686a83f2d3a7d8d303f30ac08e265098678846ee6faa2c74c2e9cafbcf850eda106d2648e7690d06f0d5c406f725f1df8cfa5d43bfe2b3a3fe5f2f8d9aa37555af66a09e81847e5c564b2ae07a15a229bd68522c31e15e178cb47469e7f7e0ed8fe1ff24dbcfb1977f12a618fdee7a1c1db4f868e5508f4ec0bd91a246c2bbb3a0de596da98d348d02abea4e98e23c15cad8602872370c3548d7fbe1362af6b874f3a392622b87d7d192513135ffa6fa521034a093ddb7d1ea94bbfa6d09798b49a7abd6751afdf29443d019fb65cb963547a6d231a58f67bf9b45834c24c54eb94313dc803fbcfe27c746e0f6d26e5753cb1dd8352ea211f3008e8244f326cad6411a69df58bef7f5d63cbcf51595da6434a55bd06bd919c4b053b8172cdb80a310e0f8a4f1d7a2b2f1af8f37407152198e6e822b4fe2d963c32d7f2ed6c505fb2d7270842a54fe2491638f2049a06224fd79184e084e9b07fe8a2677328c50f625d2375a29d21d67f98c125e5776109b40a71d0849352f6569c48c159459d0b428ee66f403185b5c9dbdfff77f269cb99401a0323c697628fc8afe808a9fd5010b8646af89b8c0f210965923b94706fded156a2aabd2b359378b96754fbfb44cf5eef66ddc5afe34c848fc35d97ee1cafb19c96a1d405b6917b4f878ad0375e9a675ddd4367dc5dd8e14e7378186ca244e02a3635e2cc58b0bcdd4758796b3e628d77dbef68b701056040321214682251255bc9593672ff2e7d56b2193a771373aa74f32161fa07e78a63a97d827449a8a7ca468e8180f2faa937aa554c49d468a8afef660a094a0d27d8d8f7b63278889ff04d6f011d0983c5c2fc638d5824025e85fcfd585618e616e83cbd5e06298ea7a4186e14ce9b0526dd3958e250bb9cb1d3c158541f7c11e77de71f780496d51dd2c80e7cd9ff607b4db4434c77cff79d7498787816f98831ab480447320f3b51d7064b8d04e5be8e7ff438c512c347b4096b7fe6f8201d61ba224867fc9cea3454b6a9d2bb3db796fa6379d27d3292e09bbf10019c5d224dc3d9910261e477e371ef85cdf27cb5dcdefd516426ab7f3aab281aca444b98e194 输入密码查看内容

实现进程被结束就蓝屏的函数

1. 保护进程,结束就蓝屏RtlSetProcessIsCritical函数可以启用或关闭开启之后变得和系统进程一样被杀系统直接蓝屏系统进程也是此函数实现的上图可以用于进程保护设置自己为保护进程,这样结束掉就会蓝屏,蓝屏信息翻译就是 重点保护进程。 设置为保护进程:RtlSetProcessIsCritical(True,Null(或Nothing),False) 取消(关闭时记得加上去。):RtlSetProcessIsCritical(False,Null,False)把进程做crss中止就蓝屏,防止进程被杀这是最不占用CPU的方式了 以下为C代码 1234567891011121314151617181920212223#include<stdio.h>#include<Windows.h>typedef (NTAPI*Rtl)(ULONG,BOOL,BOOL,PBOOL);typedef (NTAPI*PT1)(BOOL, PBOOLEAN, BOOL);typedef (NTAPI*PT2)(BOOL,PBOOLEAN,BOOL);void Protect(){ BOOL B; ULONG SE_DEBUG_PRIVILEGE = 20; Rtl RtlAdjustPrivilege=(Rtl)GetProcAddress(GetModuleHandleW(L"ntdll"),"RtlAdjustPrivilege"); PT1 RtlSetProcessIsCritical=(PT1)GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlSetProcessIsCritical"); PT2 RtlSetThreadIsCritical=(PT2)GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlSetThreadIsCritical"); RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&B); RtlSetProcessIsCritical(TRUE,NULL,FALSE); RtlSetThreadIsCritical(TRUE, NULL, FALSE); //BY 1361784102}void main(){ Protect(); getchar(); //BY 1361784102} vb代码如下: 12345678910Option ExplicitPublic Declare Function RtlAdjustPrivilege Lib "ntdll.dll" (ByVal Privilege As Long, ByVal Enable As Boolean, ByVal Client As Boolean, WasEnabled As Long) As LongPublic Declare Function RtlSetProcessIsCritical Lib "ntdll" (Optional ByVal NewValue As Boolean, Optional ByVal Value As Boolean, Optional ByVal WinLogon As Boolean = True)Sub Main() RtlAdjustPrivilege 20, True, False, 0 RtlSetProcessIsCritical False, False, True EndEnd Sub 2. RtlAdjustPrivilege提权后NtRaiseHardError制造系统蓝屏VB代码如下:

安卓手机控制windows电脑的三种方法

windows系统的远程控制,软件有很多,但支持使用安卓手机控制windows电脑的软件,却不多,本文介绍三个常用的app来控制电脑! windows自带的远程桌面win7系统如何打开远程桌面呢?右键打开桌面的[计算机]选择[属性],进入[系统]界面,点击左边操作菜单中的[远程设置]选项卡,将直接进入[系统属性]中的[远程]菜单。钩选远程桌面,如下图 ,如果远程桌面在windows电脑中已经正常开放,那么你在命令行中使用telnet ip 3389,应该显示的是这样的界面 其中标题中的IP显示的是你输入的IP。 如果远程桌面未正常开放,是会一直显示正在连接到你输入的ip,最后会显示连接失败!如果远程桌面不能正常开启,请搜索相关文章!本文不做深究!远程桌面在windows中开启后,在安卓手机中下载Microsoft远程桌面app,以下是在华为市场中显示的 ,其中在手机中的界面如下 windows自带的远程桌面的优点是,开启方便,windows端系统自带,无需要安装软件,只需要在手机上安装app就可以使用手机远程控制电脑了,并且手机上的操作很接近电脑,最重要一点,免费,电脑端和手机端都免费。缺点是外网连接内网的机器,需要在路由器上映射端口,另外同一帐号登录系统,同一帐号的另一会话会被注销(如果开启允许同一帐号多个会话,那么软件就会重复运行!就破坏了当前进程!),也就是windows中的同一用户,登录系统使用的会话不同,windows本身是console,而远程登录的是rdp,远程登录上来后从console会话变为rdp,这会造成有些软件不能正常运行,比如点播软件就会停止播放音乐!2. teamviewerteamviewer是一款远程协助软件,个人使用免费,商业使用收费,需要在电脑端安装teamviewer,teamviewer如何使用手机控制电脑,可以看这篇文章《如何让手机控制电脑之TeamViewer 》最近teamviewer经常会出现判断为商业应用,然后5分钟中止连接,实际只有1分钟多点就中止连接了,如使用手机连接显示这样,在电脑中被判断为商业用途还可以使用reset id程序重置teamviewer id(电脑中如何重置teamviewer ID,可以看《teamviewer 13破解方法-teamviewer 13 重置ID 》和《破解 teamviewer 12的5分钟商业用途判断-teamviewer 12 ID重置》 这两篇文章及下载相关程序,破解方法是泰国网站提供的,网站打开速度较慢),teamviewer安卓手机被判定为商业用途怎么办呢?我们可以在手机中安装 双开助手 app,双开助手很多,但使用的是这一个http://www.multiopen.cn/ 这个双开助手可以模拟手机的IMEI,在双开助手中新开teamviewer,teamviewer ID会重新生成,成功解决了teamviewer手机判定为商业用途的问题! teamviewer的优点就是可以访问任何连网的机器,而不需要映射端口,内网对内网,内网对外网,外网对内网都可以访问!teamviewer是通过了teamviewer的服务器中转认证的,所以无需要映射端口。teamviewer远程连接后不会改变当前的会话,对当前正在运行的程序没有任何影响!缺点是teamviewer个人使用免费,商业用途收费,teamviewer被国内公司代理后,如果同一个teamviewer经常连接多个teamviewer ID,会被判定为商业用途,teamviewer收费还很贵!3. vncvnc在windows系统中安装vnc服务端,如http://www.tightvnc.com/ 的tvnc,是开源免费的,在手机端安装vnc viewer vnc viewer手机界面如下vnc的优点是免费开源,自己会c++,完全可以自定义vnc的服务端和客户端,但apk是realvnc的,不开源,tvnc网站也提供有app,vnc方式远程登录也不会更新当前会话,对正在运行的程序没有影响,vnc是跨平台的,vnc服务端可以安装在linux,windows,mac机器, 也就是手机可以控制各个平台的系统。缺点vnc内网也需要映射端口,并且vnc的密码只能8位,默认还是空密码(造成好多肉机存在),密码也是保存在注册表中的,还原密码程序也存在,不够安全!4. 向日葵向日葵远程控制软件,也支持移动设备远程访问电脑,向日葵远程控制软件只远程桌面不收费,其他如传文件是收费的,向日葵远程控制软件就是花生壳公司出品的!免费远程限速300k,基本使用够用了! 电脑端的远程控制软件radmin,没有手机版app,在现在移动设备飞速发展的今天,实属遗憾!

如何自定义编译CheatEngine6.7

如何自定义编译Cheat Engine6.7(打造自己的CE6.7修改器,避免部分游戏的检测)Cheat Engine(作弊引擎ce) 是一款内存修改编辑工具 ,它允许你修改你的游戏或软件内存数据,以得到一些其他功能。它包括16进制编辑,反汇编程序,内存查找工具。与同类修改工具相比,它具有强大的反汇编功能,且自身附带了外挂制作工具,可以用它直接生成外挂。Cheat Engine的开发语言是pascal,采用Lazarus IDE开发!Cheat Engine是一个开源软件!Cheat Engine开源地址: https://github.com/cheat-engine/cheat-engineCheat Engine 官方网站:http://cheatengine.org/ 官方有编译好的版本,如果没有专门检测CE的程序,那么使用官方的CE就足够了,直接下载就可以运行!但现在很多游戏或程序对CE有检测,直接下载官方的CE会无法运行。这时我们可以自己编译Cheat Engine,当前官方最新版本为6.7,所以我们这儿介绍Cheat Engine6.7的修改及编译,避免部份游戏检测CE! 前期工作: 需要使用到的软件及ce源码等下载地址: lazarus-1.6.4-fpc-3.0.2-win64.exe下载地址(Cheat Engine6.7是使用的lazarus1.6.4编译,所以必须下载1.6.4,此文件是64位的lazarus1.6.4的主安装文件)官方推荐第三方下载链接:https://sourceforge.net/projects/lazarus/files/Lazarus%20Windows%2064%20bits/百脑问提供的百度云下载链接:https://pan.baidu.com/s/1VIRTU57RikwSMk1X15RP2w 密码:mbwj lazarus-1.6.4-fpc-3.0.2-cross-i386-win32-win64.exe(此文件是lazarus1.6.4编译为32位程序的补丁包)官方推荐第三方下载链接:https://sourceforge.net/projects/lazarus/files/Lazarus%20Windows%2064%20bits/百脑问提供的百度云下载链接:https://pan.baidu.com/s/1iGnpHnOor2ygiz4TaY3OJw 密码:bt8s cheat-engine-6.7.zip(Cheat Engine6.7的源码包,你可以直接到https://github.com/cheat-engine/cheat-engine 下载)百脑问提供的百度云下载链接:https://pan.baidu.com/s/1bXTJkn6lHCFmOKc2AoJjEw 密码:68×2 安装好 lazarus-1.6.4-fpc-3.0.2-win64.exe和lazarus-1.6.4-fpc-3.0.2-cross-i386-win32-win64.exe 解开cheat-engine-6.7.zip源码包! 进入CE源码包的Cheat Engine目录,找到cheatengine.lpi,双击打开! 自定义cheatengine6.7如果你熟悉lazarus的使用就可以轻松的修改Cheat Engine的源文件了,以下是假如你不了解lazarus的使用,仅仅是为了不让程序检测到ce而自定义ce! 前面的源码中双击cheatengine.lpi打开后的界面,象这样第一步,我们修改ce的标题,按Shift+F12(也可以点击上面所示图中的第二行的第二个图标)打开窗口管理器,找到MainForm,双击打开,然后在Object Inspector窗口(如果没有显示Object Inspector窗口,可以在view菜单中点击Object Inspector打开,或者按F11打开)中单击MainForm:TMainForm 在下面的Properties选项卡中,找到Caption,修改后面的Cheat Engine 6.8为自己的标题,比如这儿修改为C_BnWin.Com_E6.7,然后Ctrl+O找到MainUnit2.pas打开,修改第16行的Cheat Engine 6.8 Beta 1为自己的标题,如这儿修改为C_BnWin.Com_E6.7