浮生散记 - AHK
type: channel
link: http://doc.ilaoyao.cn/index.php/tag/AHK/
description: AHK
items: 从dll文件中读取 stringtable
items: AHK，禁用ALT+F4（桌面和任务栏）
items: AutoHotKey 笔记
items: xRun，一个为快速启动而生的App
items: 设置text控件字符有时候不显示的原因
items: 代码摘录--listview单元格颜色设置
items: 代码摘录--Listview类函数（编辑任意单元格）
items: Listview控件的一些备忘
items: 代码摘录--AutoRize
items: [小游戏]-ZigZag遍历二维数组

从dll文件中读取 stringtable
type: item
date: 2024-02-29T13:19:33+08:00
description: Read_StringTable(DllFile, StringNum) { hModule := DllCall("LoadLibrary", "str", DllFile, "Ptr") VarSetCapacity(string, 1024) DllCall("LoadString", "uint", hModule, "uint", StringNum, "uint", &string, "int", 1024) DllCall("FreeLibrary", "Ptr", hModule) Return string }举例：result:=Read_StringTable("CBDHSvc.dll", "101")

AHK，禁用ALT+F4（桌面和任务栏）
type: item
date: 2024-01-10T23:35:09+08:00
description: #SingleInstance force #Persistent SendMode Input SetBatchLines -1 return $!F4:: ;$作用等同于钩子 wid2:=WinExist("A") winget, wida,id,ahk_class Shell_TrayWnd winget,widb,ID, % "Program Manager" IF (wid2 = wida) or (wid2=widb) { msgbox,64,提醒,桌面和任务栏上禁用ALT+F4,2 return } SendInput !{F4} return

AutoHotKey 笔记
type: item
date: 2024-01-10T22:42:00+08:00
description: 对run命令后面的变量，不建议用表达式，而建议用%变量，如hosts命令用表达式反而不起作用gui命令获得的尺寸为真实尺寸，而win命令获得的尺寸均为A_screenDPI/96的倍数后的，尤其是winset，region这样的w和h一定要记得进行dpi缩放，否则窗口尺寸显示会小。gui, font 命令在其他线程中会对后面的gui一些控件（特别是销毁后再生成）的外观会有影响通过FrameShadow（GUIID）来实现窗体阴影的尺寸，似乎比A_GUIWIDTH要大一点点，哪怕是无边框无标题栏的情况scite4对某些脚本中存在emoji字符的时候，不采用% "★" 而是直接采用 ★ 这样的会出现卡死的情况。gui的+owner是指该窗口隶属于 owner后面的ID变量窗口，如 +owner%mainguiid%，当mainguiid窗口关闭时，这个gui也会自动被关闭。如果需要顶层，那么可以在该gui之前将owner窗口disable，到该gui窗口销毁的时候在enable这个owner窗口。而+parent 则将该gui嵌入到 parent后面的id变量窗口中，如嵌入到桌面，任务栏等等。sendinput {Enter} 这样的发送方式更可靠有效一个有效的判断窗体移除窗体的代码;************************************************** ;另一种窗口拖动的方案 ;************************************************** WM_LBUTTONDOWN(wParam, lParam, msg, hwnd) { static init := OnMessage(0x0201, "WM_LBUTTONDOWN") PostMessage, 0xA1, 2,,, A } ;************************************************** ;另一种窗口拖动的方案 ,成功实现鼠标离开窗口的操作，应该是通过loop操作的时间与移动速度的时间打了一个时间差 ;************************************************** WM_MOUSEMOVE(wParam, lParam, msg, hwnd) { static init := OnMessage(0x0200, "WM_MOUSEMOVE") MouseGetPos,,,cwid winset, transcolor, OFF, ahk_id %testid% loop { MouseGetPos,,,cwid if !(cwid=testid) { winset, transcolor, EAEAEA 255, ahk_id %testid% BREAK } } }暗黑主题（win10~11窗体），这条命令结合frameshadow可以避免frameshadow在guimove的时候闪动。darkme(hWnd) { if 1 DWMWA_USE_IMMERSIVE_DARK_MODE := 19 ;23h2是这个数字。貌似在10.0.17763以后都是 else DWMWA_USE_IMMERSIVE_DARK_MODE := 20 DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", hWnd, "Int", DWMWA_USE_IMMERSIVE_DARK_MODE, "Int*", true, "Int", 4) ;~ uxtheme := DllCall("GetModuleHandle", "Str", "uxtheme", "Ptr") ;~ DllCall(DllCall("GetProcAddress", "Ptr", uxtheme, "Ptr", 135, "Ptr"), "Int", 2) ;~ DllCall(DllCall("GetProcAddress", "Ptr", uxtheme, "Ptr", 136, "Ptr")) }彩色按钮button，详情参阅：https://github.com/AHK-just-megui, abt: add, button, xP y+15 w60 gbuyacoffee h25 vcfe1 hwndbtncoffee, % "buy" Opt1 := [0, 0xFF1296DB, , "White", 5, , ,2] ; "Red" ; normal flat background & text color；常规背景+字体颜色，5为圆角 Opt2 := [ , 0xFFFC0000] ; hot flat bac…

xRun，一个为快速启动而生的App
type: item
date: 2024-01-02T22:33:00+08:00
description: 前言快速启动软件简直多如牛毛，有侧重图标类操作的，有侧重命令行模式操作的，CLaunch,Lily,Lucy,nrLaunch,nTrun,Rolan,TrayLauncher,TrueLaunchBar,TurboLaunch,音速启动（VStart）,ALMRun,ALTRun,Keypirinha,Launchy,Listary,PowerToysRun,uTools,Wox,RunZ,RunAny，这里面大部分我基本都用过一次或多次，然而总觉得并没有完美契合我的需求点，所以我觉得自己来写一个，这个软件我是从2020年开始写的，也是我人生中写的第一个软件。软件在写的过程中也不断的改名，最初的版本叫PD（我家小狗的名字），后来叫过aGo，现在我给它取了一个比较俗气的名字，叫xRun。一边用一边写，从开始到至今大小版本大约迭代了40多个版本。对于快速启动类型的软件，我的观点是：轻，快，简单快速完成文件夹跳转快速启动程序xRun能干什么？它只是一个纯粹的快速启动，用最少的步骤实现操作结果的呈现。它可以在任意位置一步打开文件夹，在任意位置一步启动想要启动的程序，它可以用最少的字符输入大段常用的文字内容（如快件地址信息，如常用的短语）。它可以用命令行的模式启动，也可以用菜单模式启动。xrun文件组成：一个主程序xrun .exe，一个配置文件config.ini，xrun不需要安装，也没有设置窗口，所有的设置都是通过config.ini完成。怎么用？命令窗口模式：xrun的命令行窗口模式是通过双击热键呼出命令窗口，输入命令回车完成。热键可以定义为双击Ctrl键，或者双击 shift键盘，设置可以设置为Lctrl指定左ctrl键），关于按键名称，参见：http://doc.ilaoyao.cn/index.php/168.html菜单模式：xrun的菜单模式是通过单击鼠标中键跳出菜单，菜单分三部分组成，上段为文件夹，常用快速打开或者快速跳转，中部为CLSID特殊文件夹（如控制面板，打印机，回收站等），下段为常用程序。其中CLSID文件夹和常用程序可以设置在菜单中显示与否。如何自定义命令：xrun的自定义命令分为两种，一种是单命令，写在config.ini中的[s_cmdstr]段落中，如定义wd来启动word，ffp来启动firefox的隐私模式。写法为：wd=C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE|Word其中wd表示自定义短命令，等号后面的全路径exe表示要执行的程序，结尾的|分隔符后面的word表示该程序将会显示在菜单中，并且显示菜单名称为word，这种情况下，你可以双击热键呼出命令窗口，输入wd，回车启动word，或者你可以单击鼠标中键，在菜单中选择word启动word。如果|后面留空，则该exe将不会显示在菜单中，但是依然可以在命令窗口中输入执行。单命令主要是启动一个单独的程序用。支持带参数模式，如ffp=D:\firefox_113\core\firefox.exe -private-window，则表示输入ffp，会启动firefox的隐私模式。在windows系统中win+R中能运行的命令，都不需要单独定义，可以直接输入运行，当然，你也可以自定义，比如：ip=cmd.exe /k ipconfig，输入ip就会打开cmd窗口并且执行ipconfig的命令。单命令还支持文件夹模式，举例说比如在d:\soft\study\action\usa\pureteen\hot\2023这个隐藏的文件夹，该文件夹下面存放了一些不希望别人看到的资料，那么桌面上放个快捷方式也不妥当，资源管理器一路点下去也是非常耗时，这时候可以自定义一行：3v1=d:\soft\study\action\usa\pureteen\hot\2023，这样你可以输入3v1的时候就会一步打开该文件夹，但是菜单中并不显示，这对于一些隐私操作来说是非常方便的。第二种是双命令，写在config.ini中的[m_cmdstr]段落中双命令最常用的作为网络查询，比如你可以这样定义：jd=https://search.jd.com/Search?keyword={query}，其中jd为自定义命令，后面的表示到京东上搜索{query}这个关键词。那么在命令窗口中输入 jd 小米14，回车后就会自动打开浏览器进入京东搜索小米14，凡是支持搜索的网络站点都可以在这里写入，如豆瓣，bilibili，微博，github等等。其中{query} 表示关键词，上面例子中的小米14这就是要搜索的关键词。双命令还有一个隐藏的功能，就是快速用管理员模式运行程序（包括上面自定义的单命令程序），比如你可以输入 a…

设置text控件字符有时候不显示的原因
type: item
date: 2023-03-22T20:08:40+08:00
description: 在text控件生成后，其宽度不会自动扩展，这时候如果在后面添加了字符，超过此宽度的字符内容则无法显示。特别是对于settimer子程序中增添text控件内容长度的时候。所以在初始设置text这类控件的文本长度很重要，确保在后期能容纳修改后的文字长度内容。

代码摘录--listview单元格颜色设置
type: item
date: 2023-03-21T19:55:40+08:00
description: /* ************************************************************************************** listview单元格颜色设置class ************************************************************************************** */ ; ====================================================================================================================== ; Namespace: LV_Colors ; Function: Individual row and cell coloring for AHK ListView controls. ; Tested with: AHK 1.1.23.05 (A32/U32/U64) ; Tested on: Win 10 (x64) ; Changelog: ; 1.1.04.01/2016-05-03/just me - added change to remove the focus rectangle from focused rows ; 1.1.04.00/2016-05-03/just me - added SelectionColors method ; 1.1.03.00/2015-04-11/just me - bugfix for StaticMode ; 1.1.02.00/2015-04-07/just me - bugfixes for StaticMode, NoSort, and NoSizing ; 1.1.01.00/2015-03-31/just me - removed option OnMessage from __New(), restructured code ; 1.1.00.00/2015-03-27/just me - added AlternateRows and AlternateCols, revised code. ; 1.0.00.00/2015-03-23/just me - new version using new AHK 1.1.20+ features ; 0.5.00.00/2014-08-13/just me - changed 'static mode' handling ; 0.4.01.00/2013-12-30/just me - minor bug fix ; 0.4.00.00/2013-12-30/just me - added static mode ; 0.3.00.00/2013-06-15/just me - added "Critical, 100" to avoid drawing issues ; 0.2.00.00/2013-01-12/just me - bugfixes and minor changes ; 0.1.00.00/2012-10-27/just me - initial release ; ====================================================================================================================== ; CLASS LV_Colors ; ; The class provides six public methods to set individual colors for rows and/or cells, to clear all colors, to ; prevent/allow sorting and rezising of columns dynamically, and to deactivate/activate the message handler for ; WM_NOTIFY messages (see below). ; ; The message handler for WM_NOTIFY messages will be activated for the specified ListView whenever a new instance is ; created. If you want to temporarily disable coloring call MyInstance.OnMessage(False). Th…

代码摘录--Listview类函数（编辑任意单元格）
type: item
date: 2023-03-17T21:27:20+08:00
description: /* ********************************** 以下为LISTVIEW编辑类控件 ********************************** */ ; ================================================================================================================================== ; Namespace: LV_InCellEdit ; Function: Support for in-cell ListView editing. ; Tested with: AHK 1.1.24.00 (1.1.20+ required) ; Tested on: Win 10 Pro (x64) ; Change History: 1.3.00.00/2016-07-21/just me - Code revision + new options. ; 1.2.02.00/2015-12-14/just me - Bug fix and support for centered columns. ; 1.2.01.00/2015-09-08/just me - Added EditUserFunc option. ; 1.2.00.00/2015-03-29/just me - New version based on AHK 1.1.20+ features. ; 1.1.04.00/2014-03-22/just me - Added method EditCell ; 1.1.03.00/2012-05-05/just me - Added back option BlankSubItem for method Attach ; 1.1.02.00/2012-05-01/just me - Added method SetColumns ; 1.1.01.00/2012-03-18/just me ; ================================================================================================================================== ; CLASS LV_InCellEdit ; ; Unlike other in-cell editing scripts, this class is using the ListViews built-in edit control. ; Advantage: ; You don't have to care about the font and the GUI, and most of the job can be done by handling common ListView ; notifications. ; Disadvantage: ; I've still found no way to prevent the ListView from blanking out the first subitem of the row while editing another ; subitem. The only known workaround is to add a hidden first column. ; ; The class provides methods to restrict editing to certain columns, to directly start editing of a specified cell, and to ; deactivate/activate the built-in message handler for WM_NOTIFY messages (see below). ; ; The message handler for WM_NOTIFY messages will be activated for the specified ListView whenever a new instance is created. ; As long as the message handler is activated a double-click on any cell will show an Edit control within this cell allowing to ; edit the current content. The def…

Listview控件的一些备忘
type: item
date: 2023-03-17T21:25:31+08:00
description: 1、在使用listview内置函数之前，最好用一句： gui, listview, listviewname （listviewname表示v变量名称），否则可能出现内置函数无效。2、LV_ModifyCol(列号, “width center”) 表示调节列号的列宽并且数字居中3、ICELV2 := New LV_InCellEdit(listviewID, True) 这行代码主要是针对class函数的操作编辑时需要4、gui, GUI1:default ;如果在listview上右键出现菜单的时候，最好前面添加这句。否则可能会出现菜单无法弹出的情况。

代码摘录--AutoRize
type: item
date: 2023-03-17T21:20:27+08:00
description: 改代码对于不调整x的时候还是很有用，对于调整x的会出现bug。; ================================================================================= ; Function: AutoXYWH ; Move and resize control automatically when GUI resizes. ; Parameters: ; DimSize - Can be one or more of x/y/w/h optional followed by a fraction ; add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes ; cList - variadic list of ControlIDs ; ControlID can be a control HWND, associated variable name, ClassNN or displayed text. ; The later (displayed text) is possible but not recommend since not very reliable ; Examples: ; AutoXYWH("xy", "Btn1", "Btn2") ; AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1") ; AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices") ; --------------------------------------------------------------------------------- ; Version: 2015-5-29 / Added 'reset' option (by tmplinshi) ; 2014-7-03 / toralf ; 2014-1-2 / tmplinshi ; requires AHK version : 1.1.13.01+ ; ================================================================================= AutoXYWH(DimSize, cList*){ ; http://ahkscript.org/boards/viewtopic.php?t=1079 static cInfo := {} If (DimSize = "reset") Return cInfo := {} For i, ctrl in cList { ctrlID := A_Gui ":" ctrl If ( cInfo[ctrlID].x = "" ){ GuiControlGet, i, %A_Gui%:Pos, %ctrl% MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move" fx := fy := fw := fh := 0 For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]"))) If !RegExMatch(DimSize, "i)" dim "\s*\K[\d.-]+", f%dim%) f%dim% := 1 cInfo[ctrlID] := { x:ix, fx:fx, y:iy, fy:fy, w:iw, fw:fw, h:ih, fh:fh, gw:A_GuiWidth, gh:A_GuiHeight, a:a , m:MMD} }Else If ( cInfo[ctrlID].a.1) { dgx := dgw := A_GuiWidth - cInfo[ctrlID].gw , dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh For i, dim in cInfo[ctrlID]["a"] Options .= dim (dg%dim% * cInfo[ctrlID]["f" dim] + cInfo[ctrlID][dim]) A_Space GuiControl, % A_Gui ":" cInfo[ctrlID].m , % ctrl, % Options } } }?在guisize中引用的时候：;其中 e1 或者 b1表示GUI控件的v变量名称；"…

[小游戏]-ZigZag遍历二维数组
type: item
date: 2022-02-23T19:27:23+08:00
description: ZigZag 是用在图像压缩中的一个算法，对于任意二维数组 ar[x_max][y_max] 按照下面的顺序遍历?直接放代码，思路就是凑一个最大范围的三角形，代码可以更精简。/*ZigZag遍历任意二维数组 */ global ar:=object() a=5 ;行 b=7 ;列 c :=a+b-1 ;对角线数量 d:=a>b ? a : b make_array(a,b) loop, % c { sn2:=a_index loop, % sn2 { if (mod(sn2,2)=0) { tmp.=ar[a_index, sn2+1-a_index] ? ar[a_index, sn2+1-a_index] . "|" : "" } else { tmp.=ar[sn2+1-a_index, a_index] ? ar[sn2+1-a_index, a_index] . "|" : "" } } } msgbox, % tmp return /*生成一个二维数组 */ make_array(x,y) { loop, % x { aa:=A_Index loop, % y { ar[aa,A_index]:=a_index+(aa-1)*y } } return, % ar }