社区里也有几篇关于二维码生成的文章,有的是通过调用网页接口生成二维码,有的是通过调用QRcode.dll提供的函数生成二维码,都挺好,我这里提供一个原生的基于AHK库生成二维码的例子
#SingleInstance, Force
tmp:="
(
展示二维码有两种方法
1)在没有选中任何文本的情况下,将鼠标移至想要产生二维码的文本上方,按鼠标中键将自动选中文本并展示二维码
2)手动选中文本,按鼠标中键展示二维码
取消已展示二维码有两种方法
1)在没有选中任何文本的情况下,并且鼠标下方也没有任何文本(即鼠标在空白位置),按鼠标中键取消已展示的二维码
2)在二维码图案上的任意位置点击鼠标右键取消已展示的二维码
达不到二维码展示条件时,将恢复使用鼠标中键的原本功能
)"
msgbox,64,提示,%tmp%,60
;本脚本只能使用U32或U64版本AHK运行
SetBatchLines, -1 ;可有效提升超长内容二维码的生成速度
OnMessage(0x0201, "WM_LBUTTONDOWN") ;监听鼠标点击事件
OnMessage(0x0205, "WM_RBUTTONUP") ;监听鼠标右键弹起事件
MButton::
;clipsaved:=Clipboard ;如果有必要可以将原剪贴板数据先储存起来,等二维码窗口展示后还原
Clipboard:=""
sleep 200 ;当"SetBatchLines"为-1时,需要等待剪贴板清空完成,为避免二维码展示错误,此处延时必不可少,延时的时长和硬件速度相关
send ^c
ClipWait,0.2,0 ;判断用户当前是否已选中文本
if (ErrorLevel==1) ;未选中
{
Click,2
sleep 100
send ^c
ClipWait,0.2,0 ;判断双击是否成功选中文本
if (ErrorLevel==1) ;未选中
销毁窗口并按键("{MButton}")
}
if (Trim(Clipboard," `t`n`r")=="") ;排除字符串头尾的不可见字符
销毁窗口并按键("{MButton}")
/*
原版生成的二维码内容中若有汉字字符,则扫描二维码后的内容会变成乱码,已用UTF-8编码解决
if RegExMatch(Clipboard, "[^\x{00}-\x{ff}]") ;非Ascii字符
{
销毁窗口并按键()
msgbox 不支持汉字字符
exit
}
*/
ToolTip,二维码内容:{%Clipboard%}
SetTimer,RemoveToolTip,-5000
GUI,pic:Destroy
GUI,pic:+AlwaysOnTop +Hwndhwnd -Caption +ToolWindow +Border
GUI,pic:Add,Picture,x0 y0 w200 h-1,% 生成QR码(文本转UTF8(Clipboard),10)
GUI,pic:Show,w200 h200
Return
RemoveToolTip:
ToolTip
return
WM_LBUTTONDOWN() ;鼠标左键点击
{
PostMessage,0xA1,2 ;可以让窗口跟随鼠标移动
}
WM_RBUTTONUP() ;鼠标右键弹起
{
销毁窗口并按键()
}
销毁窗口并按键(button:="")
{
GUI,pic:Destroy
send % button
exit
}
文本转UTF8(str)
{
;引用来源https://blog.csdn.net/qq_40890233/article/details/88082611
tmp:=StrSplit(str)
for k,v in tmp
{
c:=Asc(v)
if ((c>=0x0001)&&(c<=0x007F)) ;当前字符为Aacii字符
out.=Chr(c)
else if (c>0x07FF) ;当前字符为16位Unicode字符
{
out.=Chr(0xE0|((c>>12)&0x0F))
out.=Chr(0x80|((c>>6)&0x3F))
out.=Chr(0x80|((c>>0)&0x3F))
}
Else ;当前字符为8位Unicode字符
{
out.=Chr(0xC0|((c>>6)&0x1F))
out.=Chr(0x80|((c>>0)&0x3F))
}
}
return out
}
生成QR码(str,PixelSize:=1)
{
;引用来源https://www.autohotkey.com/boards/viewtopic.php?t=5538
;PixelSize参数为二维码内部格子的大小,1为1像素大小,此参数决定二维码图片的大小(清晰度)
;可以生成以下几种一维、二维码类型,这里只使用QR码
;BARCODER_GENERATE_CODE_39()
;BARCODER_GENERATE_CODE_ITF()
;BARCODER_GENERATE_CODE_128B()
;BARCODER_GENERATE_QR_CODE()
MATRIX_TO_PRINT := BARCODER_GENERATE_QR_CODE(str)
if (MATRIX_TO_PRINT = 1) ;出现的几率最多,所以单独判断,实际上在本示例脚本不会出现此种情况
{
;Msgbox, 0x10, Error, The input message is blank. Please input a message to succesfully generate a QR Code image.
Msgbox, 0x10, 错误, 输入内容为空,请输入内容以成功生成QR码图像。
exit
}
If MATRIX_TO_PRINT between 1 and 7
{
;Msgbox, 0x10, Error, ERROR CODE: %MATRIX_TO_PRINT% `n`nERROR CODE TABLE:`n`n1 - Input message is blank.`n2 - The Choosen Code Mode cannot encode all the characters in the input message.`n3 - Choosen Code Mode does not correspond to one of the currently indexed code modes (Automatic, numeric, alphanumeric or byte).`n4 - The choosen forced QR Matrix version (size) cannot encode the entire input message using the choosen ECL Code_Mode. Try forcing a higher version or choosing automated version selection (parameter value 0).`n5 - The input message is exceeding the QR Code standards maximum length for the choosen ECL and Code Mode.`n6 - Choosen Error Correction Level does not correspond to one of the standard ECLs (L, M, Q and H).`n7 - Forced version does not correspond to one of the QR Code standards versions.
Msgbox, 0x10, 错误,错误代码:%MATRIX_TO_PRINT%`r`n错误代码表:`r`n1-输入内容为空`r`n2-所选择代码模式无法对输入内容中的所有字符进行编码`r`n3-所选择代码模式不符合当前的索引代码模式(自动、数字、字母数字或字节)`r`n4-所选择的强制QR矩阵version(size)不能使用所选择的ECL代码_模式编码整个输入消息,尝试强制执行较高版本或者将参数留空(参数默认值为0)version (size)5-输入信息超过所选 ECL 和代码模式的 QR 码标准最大长度`r`n6-选择的错误修正级别不对应于标准ECL(L、M、Q和H)之一`r`n7-强制版本不符合QR码标准版本之一
exit
}
; Start gdi+
If !pToken := Gdip_Startup()
{
;MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
MsgBox, 48,Gdiplus启动失败,请确保你的系统上有Gdiplus
ExitApp
}
; Adding 8 pixels to the width and height here as a "quiet zone" for the image. This serves to improve the printed code readability. QR Code specs require the quiet zones to surround the whole image and to be at least 4 modules wide (4 on each side = 8 total width added to the image). Don't forget to increase this number accordingly if you plan to change the pixel size of each module.
;增加8像素的宽度和高度的白色填充区作为“静止区”的图像,这有助于提高QR码的可读性,QR 码规格要求静止区围绕整个图像,并至少有4个模块宽(每边4 = 8总宽度添加到图像),如果你计划更改QR码的图像大小,请不要忘记相应地修改这个数字。
pBitmap := Gdip_CreateBitmap((MATRIX_TO_PRINT.MaxIndex() + 8) * PixelSize, (MATRIX_TO_PRINT.MaxIndex() + 8) * PixelSize)
G := Gdip_GraphicsFromImage(pBitmap)
Gdip_SetSmoothingMode(pBitmap, 3)
pBrush := Gdip_BrushCreateSolid(0xFFFFFFFF)
Gdip_FillRectangle(G, pBrush, 0, 0, (MATRIX_TO_PRINT.MaxIndex() + 8) * PixelSize, (MATRIX_TO_PRINT.MaxIndex() + 8) * PixelSize) ;同上
Gdip_DeleteBrush(pBrush)
;以下为使用Gdi+在二维矩阵中按数据逐个格子填充黑色或白色色块
Loop % MATRIX_TO_PRINT.MaxIndex() ; Acess the Rows of the Matrix ;矩阵行
{
CURRENT_ROW := A_Index
Loop % MATRIX_TO_PRINT[1].MaxIndex() ; Access the modules (Columns of the Rows). ;行中的每个块(或者称呼为列)
{
CURRENT_COLUMN := A_Index
If (MATRIX_TO_PRINT[CURRENT_ROW, A_Index] = 1)
{
;Gdip_SetPixel(pBitmap, A_Index + 3, CURRENT_ROW + 3, 0xFF000000) ; Adding 3 to the current column and row to skip the quiet zones.
Loop %PixelSize%
{
CURRENT_REDIMENSION_ROW := A_Index
Loop %PixelSize%
Gdip_SetPixel(pBitmap, (CURRENT_COLUMN * PixelSize) + (3*PixelSize) - 1 + A_Index, (CURRENT_ROW * PixelSize) + (3*PixelSize) - 1 + CURRENT_REDIMENSION_ROW, 0xFF000000)
}
}
If (MATRIX_TO_PRINT[CURRENT_ROW, A_Index] = 0) ; White pixels need some more attention too when doing multi pixelwide images. ;在处理多像素范围的图像时,白色像素也需要更多的关注。
{
Loop %PixelSize%
{
CURRENT_REDIMENSION_ROW := A_Index
Loop %PixelSize%
Gdip_SetPixel(pBitmap, (CURRENT_COLUMN * PixelSize) + (3*PixelSize) - 1 + A_Index, (CURRENT_ROW * PixelSize) + (3*PixelSize) -1 + CURRENT_REDIMENSION_ROW, 0xFFFFFFFF)
}
}
}
}
StringReplace, FILE_NAME_TO_USE, str, `" ; We can't use all the characters that byte mode can encode in the name of the file. So we are replacing them here (if they exist).
;FILE_PATH_AND_NAME := A_ScriptDir . "\" . SubStr(RegExReplace(FILE_NAME_TO_USE, "[\t\r\n\\\/\`:\`?\`*\`|\`>\`<]"), 1) ; Same as above.
FILE_PATH_AND_NAME := A_Temp . "\tmp.png" ;原代码是将图片以二维码内容命名后存储到脚本同目录,这里改为放置到系统临时文件夹,如果需要批量生成QR码图片,可以更改此处逻辑
;IfExist,%FILE_PATH_AND_NAME% ;检查文件是否已经存在,如果目标二维码文件已被其他程序打开,则新生成的二维码文件会由于无法覆盖原文件而出错
;MsgBox,4144,Error,%FILE_PATH_AND_NAME%`nalready exists - try again
Gdip_SaveBitmapToFile(pBitmap, FILE_PATH_AND_NAME) ;保存位图到目标文件
Gdip_DisposeImage(pBitmap)
Gdip_DeleteGraphics(G)
Gdip_Shutdown(pToken)
Return FILE_PATH_AND_NAME ;返回二维码图片的地址用于GUI图片控件的显示
}
;必须在脚本的尾部引入以下两个库
#Include BARCODER.ahk
#Include Gdip_All.ahk
Barcoder库和Gdip_all库链接如下
https://github.com/Ixiko/AHK-libs-and-classes-collection/blob/master/libs/a-f/BARCODER.ahk
https://github.com/Drugoy/Autohotkey-scripts-.ahk/blob/master/Libraries/Gdip_All.ahk
如果打不开GitHub的链接,也可以直接下载库文件
Barcoder.ahk
1ide
复制
Gdip_all.ahk
dy3g
复制