修改你的显卡和CPU为最新型号,让你的硬件与时俱进!

功能说明查看一台电脑的硬件配置,一般通过设备管理器,也可以通过dxdiag查看!决定电脑配置性能的最主要零件,应属CPU和显卡了,有没有办法让设备管理器中显示的CPU和显卡名字,修改为我自己想显示的呢?本软件就具有此功能,软件名一叶障目,就是自己骗自己的意思,硬件没变,只是名字变了,把750 Ti的显卡瞬间变成3060显卡,把I3的cpu瞬间显示为I7的cpu 下图演示了,配置好原显卡或cpu名称,再配置好需要显示的显卡或cpu名字,运行一下本软件,设备管理器和dxdiag中显示的硬件名字就修改成功了!本软件只需要运行一次就修改成功了(家用电脑),如果有还原,只需开机运行一次就修改成功!(网吧电脑)(暂时只持intel的cpu和n卡,AMD和A卡能否修改暂且未知,没测试环境) 特别说明本软件就是你寻找的修改显卡型号软件,修改CPU型号软件,软件并未真正修改显卡信息,cpu信息,硬件没变,只是修改了显卡显示信息和CPU显示信息!对系统正常运行没有任何影响! 常见问题 修改显卡型号,修改CPU型号后,重启系统会还原吗? Win7系统下如果你的电脑不带还原功能,修改后重启系统是不会还原的,如果有还原功能,就理所当然会还原!举个例,如果在的桌面建一个文件,重启后这个文件还会存在吗?如果有还原,重启是不会存的,没还原文件是会存在的!同时重做系统后,肯定会还原!win10和win11系统在重启后会自动恢复部份cpu的显示,所以win10和win11不论你有没有还原,开机都需要运行一次本工具才能全部修改成功!本软件只是修改了显示名字,并不是芯片级修改!如果芯片级修改,那不乱套了? 修改显卡型号,修改CPU型号有什么用?当前电脑硬件价格太贵,实际的游戏等需要的硬件配置并不高,但行业内卷严重,比如网吧,一个英雄联盟游戏,需要3080显卡来玩吗?显然不需要,但有的网吧就是有钱,打出的招牌是全是3系列显卡,一张3系列显卡,价格几千到近两万,这就是典型的行业内卷,实际你的1660玩英雄联盟一样丝滑,你就可以使用本软件把1660修改显示为2060,建议别修改太高,那样会误导网民,用你的机器去玩要求高配置的steam游戏!cpu也是一样的道理!(有种网吧叫隔壁网吧全是3系列显卡,全是I7 I9 CPU)

局域网文件多播,局域网拷贝文件,大文件批量传输

功能简介  HOU文件多播 是用于局域网文件“一对多”批量传输的软件。它是基于UDP的可靠传输,能有效提高传输速度,并减轻服务器负载。   多播(组播)的优点:可以真正同时的进行文件传送,客户机越多,总体速度就越快。因为 总体速度 = 传送速度 X 客户机数目 。特别适合大文件的批量传输! 使用功能说明选项:  1.“循环启动”,和“自动开始”配合使用可实现无人值守。  2.“自动开始”,根据设置的条件自动开始传输,如:当有3个接收端连接时 或 当有一个接收端连接且达到“最大等待”时间。  3.“传输速率”,这个对在高负载网络上传输时较实用,可限制传输的带宽占用,减轻网络负载。如果接收端性能较差可以适当限制传输速率,以提高整体速度。  4.“传输接口”,一般最好选择固定接口,特别是在发送端上存在ADSL拨号时需要选择接口,软件会自动添加组播路由,以正常传输。  5.“开启流模式”,强制以组播方式传输,就算只有一个接收端(正常情况下只有一个接收端时会使用点对点传输)。此功能开启后允许接收端加入一个正在传输的会话进行接收(但之前已经传输的数据将无法收到,所以一般不要中途加入)。 高级选项:  6.“初始片块数”,相当于TCP中的窗口大小,就是一次连续发送的块(UDP包)数。0为默认,一般不要修改。  7.“动态调整片块数”,根据重传情况自动调整连续发送的块数,以适应波动较大的网络(如无线)。  8.“超时重试次”,在发送完一片后请求接收端确认时,重试次数,以确定是否要放弃无响应的接收端。如果经常出现接收端被断开,可适当加大重试次数。 文件说明:  “DMCSender.exe” 发送端   “DMCReceiver.exe” 接收端  使用:    开始 -> 运行 -> DMCReceiver.exe D:\ 图文使用说明

系统无法启动-电脑蓝屏等怎么办?使用Win10系统内置的万能工具解决此类问题!

Windows无法正常工作,一般情况下很多人的做法就是重装系统,但对于电脑小白来说,重装系统就像是一个难题。并且系统中的数据最为重要,重装不是最好的选择。如果系统出现了问题,大家可利用该工具修复系统问题,实在没辙了再重装也为时未晚! 由于磁盘损坏、系统文件损坏或缺少 或安装更新时挂起的操作,系统可能无法启动,依次执行 BCDEdit (查看系统盘符) CHKDSK /f 系统盘符: (修复磁盘错误) SFC /scannow /offbootdir=系统盘符:\ /offwindir=系统盘符:\windows (检查修复系统文件) 这是微软官方给出的解决windows常见启动问题的方法!蓝屏或启动不了系统,可以试试这样操作,不能保证百分百成功,至少离恢复正常工作环境又近了一步!注册表造成的蓝屏可以使用上个蓝屏视频试试! 执行sfc的相关提供信息如下: 欢迎关注百脑问抖音:杰叔说电脑 抖音号:jscomp 欢迎关注百脑问抖音:表情包零动画 抖音号:bqbao

解决在hexo上github推送连接失败的问题

在国内,有时候使用 git clone 的速度实在太慢而让人难以承受,或者 git pull/git push 一点反应都没有,这里整理了一下解决方法,亲测有效。总的来说,这是因为 github.global.ssl.fastly.net 域名被限制了。只要找到这个域名对应的 ip 地址,然后在 hosts 文件中加上 ip–>域名 的映射,刷新 DNS 缓存便可。1.查找域名对应的 ip 地址 在网站 https://www.ipaddress.com/ 分别搜索 github.global.ssl.fastly.net 和 github.com 或者在本地的终端中如下键入: 123456789101112131415$ nslookup github.global.ssl.fastly.NetServer: 127.0.0.53Address: 127.0.0.53#53Non-authoritative answer:Name: github.global.ssl.fastly.NetAddress: 151.101.229.194$ nslookup github.comServer: 127.0.0.53Address: 127.0.0.53#53Non-authoritative answer:Name: github.comAddress: 13.229.188.59 修改 hosts 文件 Windows 上的 hosts 文件路径在: C:\Windows\System32\drivers\etc\hosts在 hosts 文件末尾添加两行1234567891011121314151617181920212223# Copyright (c) 1993-2009 Microsoft Corp.## This is a sample HOSTS file used by Microsoft TCP/IP for Windows.## This file contains the mappings of IP addresses to host names. Each# entry should be kept on an individual line. The IP address should# be placed in the first column followed by the corresponding host name.# The IP address and the host name should be separated by at least one# space.## Additionally, comments (such as these) may be inserted on individual# lines or following the machine name denoted by a '#' symbol.## For example:## 102.54.94.97 rhino.acme.com # source server# 38.25.63.10 x.acme.com # x client host# localhost name resolution is handled within DNS itself.# 127.0.0.1 localhost# ::1 localhost199.232.69.194 github.global.ssl.fastly.net Linux 的 hosts 文件路径在 /etc/hosts 中:1$ sudo vim /etc/hosts 刷新 DNS 缓存 windows1ipconfig /flushdns linux1$ sudo /etc/init.d/networking restart 参考文献解决linux上git clone速度慢的问题git clone速度太慢的解决办法 本文转载自解决 GitHub 的 host 域名被限制的问题

看完世界上最诡异的图片,你还会相信你的眼睛吗?

如果你看见这个舞女是顺时针转,说明你用的是右脑;­如果是逆时针转,说明你用的左脑。­据说,14%的美国人可以两个方向都能看见。­可以和别人一起看,测试下,一般不同人同时看这张图的感觉都会不太一样的,真的很神奇。照片的本身由34张图片组成的gif图,在photoshop中,一张一张的看,是从左向右转动,如果你看到的图片一会左转,一会儿右转,并不是图片本身是多方向变动的,这一点你可以下载图片自己用photoshop查看! 下面这张图片:柱子到底是圆的还是方的,别着急慢慢看 看着黑点身体前后移动 这些图片到底是静的还是动的(看则静,不看则动)

编程实现关闭显示器等的python源代码-等同于按显示器的电源键

可实现功能通过显示器的 DDC/CI 来直接操作显示器,拯救可怜的显示器按键。 支持的操作: 调整亮度 调整对比度 设置色温 / 颜色预设 设置RGB颜色的比例 OSD语言 开关机 切换输入源 自动调整图像 (VGA输入需要) 恢复出厂设置 系统需求Windows Vista +Python3 (建议安装时选上Python Launcher)支持DDC/CI的外接显示器,不支持笔记本内置显示器 使用参考GUI 模式不附加参数启动 monitor_ctrl.py 即可启动GUI,直接拖动滑条设置显示器的参数。 由于显示器应用VCP指令可能需要一定时间,为避免出错,GUI模式将忽略命令行指定的操作。 GUI中显示的配置不会自动刷新,要查看新的配置目前需要重启应用程序。 将文件后缀修改为 .pyw, 直接双击打开,可以避免显示conhost黑窗口 命令行模式当指定 -c 选项或者 tkinter import失败就会使用CLI模式。 py monitor_ctrl.py [-h] [-m Model_string] [-s Settings_string] [-r] [-t] [-c] [-l] [-v] -h 显示帮助 -m 指定要应用到的Monitor Model,不指定则应用到所有可操作的显示器 -s property1=value1:property2=”value 2” 应用多项设置 -r 将显示器恢复出厂设置 -t 对输入执行自动调整(仅VGA输入需要) -c 不启用GUI -l 显示可操作的显示器model -v Verbose logging

实现GiteePages自动部署的aardio源码

问题的由来github提供开源项目管理,同时提供静态网站github page,但国内访问速度很慢,经常打不开,gitee码云在国内,提供和github一样的功能,但gitee page每次推送文件后,不会自动刷新(免费版),必须手动刷新!网上已有提供python自动刷新Gitee Pages的源码! python自动部署Gitee Pages源码 python环境要求python3 + selenium + chromedrive.exe。 先安装好python3(最好设置好国内镜像源,不然安装库,因墙的缘故可能失败) 再安装好selenium库pip install seleniumpip install Alert 下载chrome对应的chromedriver 2.python源码 123456789101112131415161718192021222324252627import timefrom selenium import webdriverfrom selenium.webdriver.common.alert import Alertoption = webdriver.ChromeOptions()#指定chrome浏览器option.binary_location=r'D:\Program Files\CentBrowser64\chrome.exe'#指定chromedriver和chrome版本要匹配driver = webdriver.Chrome(r'D:\Program Files\CentBrowser64\chromedriver.exe')driver.get('https://gitee.com/login')driver.maximize_window()time.sleep(2)user_login = driver.find_element_by_id('user_login')user_login.send_keys("gitee的用户名")driver.find_element_by_id('user_password').send_keys("gitee的登录密码")driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div[1]/div[2]/div[1]/form[1]/div/div/div/div[4]/input').click()time.sleep(2)driver.get('https://gitee.com/此处改为you_gitee_id/此处改为you_gitee_id/pages')driver.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[2]/div/form/div[6]').click()Alert(driver).accept()time.sleep(5)print("成功")driver.quit()fp = open("D:\log.txt", "a+")now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())fp.write("部署时间:{0}\n".format(now_time))fp.close() 提供此代码的开源项目地址:https://github.com/witmy/my-giteepages上面的代码修改了一下,指定了chrome浏览器地址和chromedriver的地址,这样就不会运行不了!特别适合小白! aardio自动部署Gitee Pages的源码python的代码,如果是新手,安装python,然后直接运行上面的源码,成功的机率很小,因为Chrome driver是需要浏览器和driver版本匹配的!上面的python源码,如果你不熟悉python,基本上调试不会成功!不过不要紧,下面我讲的,小白也会的aardio教程,一步一步复杂粘贴就能实现,你不需要会python,不需要会aardio,一样可以编译一个自动更新gitee pages的执行文件!

发现网卡变百兆自动发送邮件通知的AutoIt源码

问题的出现网吧维护中,由于交换机或水晶机或工艺上的问题,有些机器网卡正常的千兆会变成百兆,在无盘系统中启动机器或启动游戏变得很慢,用户体验相当不好!出现这个问题时,网管或维护却很难第一时间发现1000M变成100M的问题机器。以下是使用autoit3写的,发现任意网卡是100M,就会按mail.ini配置文件中指定的邮件发送邮件通知,让你第一时间发现这种网卡变100M的问题机器,及时进行处理! 把以下代码保存为au3脚本或编译为可执行文件后,需要在同目录下建一个mail.ini文件,内容如下[setup]FromAddress=发件人@qq.comtoaddress=收件人@qq.comusername=qq号password=QQ的smtp服务器提供的邮件授权码body=邮件正文内容 其中password内容,应该进入你的QQ邮箱开通smtp和取得授权码 使用方法设置好mainl.ini中的qq的smtp服务器的用户名及授权码等一切信息后,开机执行一次此代码就行,检测完成自动退出程序 autoit源码如下以下为autoit3实现发现任意一网卡是100M,自动根据设置的邮件发送邮件通知! 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> #Include<file.au3>#NoTrayIcon$badlan=false$a = _GetAdaptersInfo() For $i = 1 To $a[0][0] $lSpeed=GetIfEntry($a[$i][3])if $lSpeed=100 then $badlan=true ExitLoopendifNextif $badlan=true then $SmtpServer = "smtp.qq.com" ; address for the smtp-server to use - REQUIRED $FromName = "发送人" ; name from who the email was sent $FromAddress = IniRead(@WorkingDir&"\mail.ini","setup","FromAddress","") $ToAddress = IniRead(@WorkingDir&"\mail.ini","setup","toaddress","") $Subject = @ComputerName&"号机器网卡为100M,请检查!" ; subject from the email - can be anything you want it to be ;$Body = "邮件正文" ; the messagebody from the mail - can be left blank but then you get a blank mail $Body = IniRead(@WorkingDir&"\mail.ini","setup","body","") $AttachFiles = "" ; the file you want to attach- leave blank if not needed $CcAddress = "" ; address for cc - leave blank if not needed $BccAddress = "" ; address for bcc - leave blank if not needed $Importance = "Normal" ; Send message priority: "High", "Normal", "Low" $Username = IniRead(@WorkingDir&"\mail.ini","setup","Username","") $Password = IniRead(@WorkingDir&"\mail.ini","setup","Password","") $IPPort = 465 ; port used for sending the mail $ssl = 1 $rc = _INetSmtpMailCom ( $SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl )endif;msgbox(0,"",$ToAddress)Func SetListView() $a = _GetAdaptersInfo() $index = ($a[1][3]) For $i = 1 To $a[0][0] GUICtrlCreateListViewItem($a[$i][1] & '|' & _ StringLeft(Hex($a[$i][2]), 12) & '|' & _ $a[$i][6] & '|' & _ GetIfEntry($a[$i][3]) & ' MB', $ListView1) Next EndFunc ;==>SetListView Func GetIfEntry($ifIndex) Local $tagBuffer, $tBuffer, $pBuffer, $iResult, $iSpeed, $sDescr $tagBuffer = "wchar[256];dword[5];byte[8];dword[16];char[256]" $tBuffer = DllStructCreate($tagBuffer) $pBuffer = DllStructGetPtr($tBuffer) DllStructSetData($tBuffer, 2, $ifIndex, 1) $iResult = DllCall("iphlpapi.dll", "long", "GetIfEntry", "ptr", $pBuffer) $iSpeed = DllStructGetData($tBuffer, 2, 4) / 1000 / 1000 $sDescr = DllStructGetData($tBuffer, 5) $tBuffer = 0 Return SetError($iResult[0], $iSpeed, $iSpeed) EndFunc ;==>GetIfEntry Func _GetAdaptersInfo() Local $iResult, $tBuffer, $pBuffer, $aResult[1][9], $tagADPTINFO, $tAdpt ; 第一次调用传递空值,pOutBufLen ( $iResult[2] ) 设为结构所需大小,单位byte。 $iResult = DllCall("iphlpapi.dll", "dword", "GetAdaptersInfo", "ptr", 0, "ulong*", 0) $tBuffer = DllStructCreate("byte[" & $iResult[2] & "]") ; 定义$iResult[2] 字节的缓存区域 (分配内存空间)。 $pBuffer = DllStructGetPtr($tBuffer) ; 获取内存指针。 ; 第二次调用,GetAdaptersInfo把网卡信息复制到指定的内存空间 ($tBuffer) 中。 $iResult = DllCall("iphlpapi.dll", "dword", "GetAdaptersInfo", "ptr", $pBuffer, "ulong*", $iResult[2]) ; $iResult[0]值为0则调用成功,否则为系统错误号。 ; 数据转换, byte --> IP_ADAPTER_INFO $tagADPTINFO = "ptr NextAdpt; dword ComboIndex; char AdptName[260]; char AdptDescr[132];uint AddrLength;byte MacAddr[8];dword Index;uint Type; uint DhcpEnabled;ptr CurrentIpAddr;ptr NextIpAddr; char IpAddr[16];char IpAddrMask[16]; dword IpAddrCxt; ptr NextGateway; char GatewayAddr[16]; char GatewayAddrMask[16];dword GatewayCxt; ptr NextDhcp; char DhcpAddr[16]; char DhcpAddrMask[16];dword DhcpCxt; int HaveWins; ptr NextPriWinsServer; char PriWinsServerAddr[16]; char PriWinsServerAddrMask[16]; dword PriWinsServerCxt; ptr NextSecWinsServer; char SecWinsServerAddr[16]; char SecWinsServerAddrMask[16]; dword LeaseObtained; dword LeaseExpires" While $pBuffer $tAdpt = DllStructCreate($tagADPTINFO, $pBuffer) $aResult[0][0] += 1 ReDim $aResult[$aResult[0][0] + 1][9] $aResult[$aResult[0][0]][0] = DllStructGetData($tAdpt, "AdptName") ; 网卡名称 $aResult[$aResult[0][0]][1] = DllStructGetData($tAdpt, "AdptDescr") ; 网卡描述 $aResult[$aResult[0][0]][2] = DllStructGetData($tAdpt, "MacAddr") ; 网卡MAC $aResult[$aResult[0][0]][3] = DllStructGetData($tAdpt, "Index") ; 网卡索引号 $aResult[$aResult[0][0]][4] = DllStructGetData($tAdpt, "Type") ; 类型 $aResult[$aResult[0][0]][5] = DllStructGetData($tAdpt, "DhcpEnabled") ; DHCP是否启用 true = 启用, false = 禁用 $aResult[$aResult[0][0]][6] = DllStructGetData($tAdpt, "IpAddr") ; IP 地址 $aResult[$aResult[0][0]][7] = DllStructGetData($tAdpt, "GatewayAddr") ; 网关地址 $aResult[$aResult[0][0]][8] = DllStructGetData($tAdpt, "DhcpAddr") ; DHCP地址, 只有DhcpEnabled为true时,此值才有效。 $pBuffer = DllStructGetData($tAdpt, "NextAdpt") ; [下一张网卡信息的内存地址。] $tAdpt = 0 WEnd $tBuffer = 0 Return SetError($iResult[0], 0, $aResult) EndFunc ;==>_GetAdaptersInfo; The UDFFunc _INetSmtpMailCom ( $s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance= "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0 ) Local $objEmail = ObjCreate ( "CDO.Message" ) $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>' $objEmail.To = $s_ToAddress Local $i_Error = 0 Local $i_Error_desciption = "" If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress $objEmail.Subject = $s_Subject If StringInStr ( $as_Body, "<" ) And StringInStr ( $as_Body, ">" ) Then $objEmail.HTMLBody = $as_Body Else $objEmail.Textbody = $as_Body & @CRLF EndIf If $s_AttachFiles <> "" Then Local $S_Files2Attach = StringSplit ( $s_AttachFiles, ";" ) For $x = 1 To $S_Files2Attach [ 0 ] $S_Files2Attach [ $x ] = _PathFull ( $S_Files2Attach [ $x ] ) ConsoleWrite ( '@@ Debug(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF ) ;### Debug Console If FileExists ( $S_Files2Attach [ $x ] ) Then $objEmail.AddAttachment ( $S_Files2Attach [ $x ] ) Else ConsoleWrite ( '!> File not found to attach: ' & $S_Files2Attach [ $x ] & @LF ) SetError ( 1 ) Return 0 EndIf Next EndIf $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/sendusing" ) = 2 $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ) = $s_SmtpServer If Number ( $IPPort ) = 0 then $IPPort = 25 $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ) = $IPPort ;Authenticated SMTP If $s_Username <> "" Then $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ) = 1 $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/sendusername" ) = $s_Username $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ) = $s_Password EndIf If $ssl Then $objEmail.Configuration.Fields.Item ( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ) = True EndIf ;Update settings $objEmail.Configuration.Fields.Update ; Set Email Importance Switch $s_Importance Case "High" $objEmail.Fields.Item ( "urn:schemas:mailheader:Importance" ) = "High" Case "Normal" $objEmail.Fields.Item ( "urn:schemas:mailheader:Importance" ) = "Normal" Case "Low" $objEmail.Fields.Item ( "urn:schemas:mailheader:Importance" ) = "Low" EndSwitch $objEmail.Fields.Update ; Sent the Message $objEmail.Send If @error Then SetError ( 2 ) Return $oMyRet [ 1 ] EndIf $objEmail= ""EndFunc ;==>_INetSmtpMailCom; 成品下载地址

使用croc两网吧之间同步互传文件

故事背景网吧A和网吧B之间经常有这样的事情发生:网吧A更新游戏,如pubg,更新量很大,比如40G,网吧A速度很快,已经更新完成,但网吧B速度慢,到游戏开服也只更新了20G。如果把网吧A的游戏同步更新到网吧B呢?一般的做法是用U盘从网吧A拷到网吧B但网吧使用无盘服务器,需要在服务器上插U盘,风险较高!并且比较麻烦,从网吧A拷了游戏还要跑网吧B操作。如果在网吧A开通ftp,再从网吧B下载,速度不敢保证,并且还得映射端口,各种复杂的操作!普通小白做不到!其中直接同步,可以采用syncthing实现两网吧P2P文件同步,syncthing需要双方安装,总之操作不够简单!croc是使用golang 编写的工具,允许任何两台计算机简单和安全地传输文件和文件夹。据我所知,croc 是唯一的 CLI 文件传输工具。对,你没听错,只需要一个文件croc.exe,分别拷到网吧A和网吧B的游戏目录,同时运行就可以互传文件或文件夹!如果网吧A和网吧B的带宽均不高,网吧间互传文件很慢,那么你也可以从网吧A用U盘拷游戏到网吧B,从客户机使用croc和网吧B的服务器同步文件,局域网传文件相当快,比在服务器插U盘相比,中毒风险直接排除! 功能介绍  croc 的特性:允许任意两台计算机传输数据(使用一个中继)  提供端到端加密(使用 PAKE)  支持方便的跨平台传输,支持 Windows、Linux、Mac  允许多文件传输  允许恢复被中断的传输  不需要本地服务器或端口转发  通过压缩和多路复用比虫洞、rsync、scp 更快(加速 1.5x 到 4x)  支持IPv6和IPv4;  支持使用Tor之类的代理; 简单使用方法 如需发送文件,可以直接运行下列命令: 123$ croc send [file(s)-or-folder]Sending 'file-or-folder' (X MB)Code is: code-phrase 接下来,在另一台电脑上使用下列命令来进行文件或目录接收: 1$ croc code-phrase 这里的code-phrase即密码短语,用于建立密码认证密钥协议(PAKE),该协议将生成一个密钥供发送方和接收方用于端到端加密。 自定义密码短语我们可以使用下列方式来配置自己的密码短语,必须是4个字符以上:

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