/* dllcall调用其实很简单,因为每个参数都会自动对齐到ptr类型的字节数,所以基本上参数类型全部用Ptr或者int就行。 例外的是,要明白参数类型的必要原因两个:1、ptr表达不了浮点数,所以如果API的声明指出该参数是浮点数,就要用float或double。 2、在32位系统中ptr是4字节,但是如果API的声明指出该参数是64位的long long,参数自动对齐到不了8字节,就要用int64。 除了前面的两个必要原因,都可以用Ptr或int。 输入字符串是字符串的变量地址,即&变量。 另外为了让ahk帮我们转换字符串和从Ptr地址帮我们读取API声明中的输出值,我们对字符串不要自己取地址&变量,而用str/astr/wstr类型,对于API的地址输出值不用Ptr,而用uint*或者Ptr*,让ahk帮我们转换字符串或读取出值。 最终,也就是先全写Ptr,然后考虑必要的两种情况,再考虑有好处的两种情况,参数类型的设置就完成了,万变不离其宗。 */ DllCall("Sleep", "UInt", 9) ; 代替Sleep 10以下的精度还是可以的 ; DllCall返回鼠标坐标 DllCall("GetCursorPos", "uint64*", v:=0), _x := 0xFFFFFFFF & v, _y := v >> 32 MsgBox % _x ", " _y ; --------------------------------------------------------------------- ;锁定屏幕 DllCall("LockWorkStation") ; --------------------------------------------------------------------- ; 鼠标移动 1::DllCall("mouse_event", "Int", 0x01, "Int", -2000, "Int", 0) ; 相对移动【游戏可用】 ^LButton::DllCall("mouse_event", "UInt", 1, "UInt", 0, "UInt", 20) ; 绝对坐标移动 DllCall("mouse_event", "Int", 0x8000 | 0x01, "Int", 111 * 65535 / A_ScreenWidth, "Int", 222 * 65535 / A_ScreenHeight) DllCall("mouse_event", "UInt", 0x01 , "UInt", x, " UInt", y) DllCall("mouse event", "UInt", 0x01 , "UInt", dx, "UInt", dy, "UInt", 0, "UPtr", 0) ; --------------------------------------------------------------------- ; 示例一:内嵌窗口 ; 功能:将一个或多个窗口内嵌到另一个窗口 ; 代码: DllCall("SetParent", "uint", 子句柄, "uint", 父句柄) ; --------------------------------------------------------------------- gui,new,Hwnd父句柄 Resize +MinSize640x480 Gui, Show,w800 h600 , 父窗口 return #rbutton:: MouseGetPos,,,子句柄,,2 DllCall("SetParent", "uint", 子句柄, "uint", 父句柄) return GuiClose: ExitApp ; --------------------------------------------------------------------- ; 示例二:获取控件或窗口的父窗口 ; --------------------------------------------------------------------- MouseGetPos, , , , controlclassnn ;获得一个控件 ControlGet, hwnd, Hwnd, , %controlclassnn%, A ;获得控件句柄 ;WinGetClass, class, ahk_id %hwnd% Parent:=1 while Parent Parent := DllCall("GetParent","int",hwnd),p := Parent ? Parent : p,hwnd := Parent ? Parent : hwnd ;获取最顶层父窗 WinGetClass, ParentClass, ahk_id %p% MsgBox %ParentClass% ; --------------------------------------------------------------------- ; 示例三:通过控件句柄获取控件ClassNN ;by https://autohotkey.com/board/topic/45627-function-control-getclassnn-get-a-control-classnn/ ; ---------------------------------------------------------------------------------- ; Lexikos: Find ClassNN by enumerating child controls and counting ; the number of controls of the target class. eControl_GetClassNN(hWnd, hCtl) { static sCtl, sCls, sProc, sNN, sRet if (A_EventInfo = sProc) { WinGetClass, cls, ahk_id %hWnd% if (cls == sCls) { sNN += 1 if (hWnd = sCtl) { sRet := sCls sNN return false ; stop } } return true ; continue } if !sProc sProc := RegisterCallback(A_ThisFunc,"F") sCtl := hCtl WinGetClass, sCls, ahk_id %sCtl% sNN := 0 sRet := "" DllCall("EnumChildWindows", "uint", hWnd, "uint", sProc, "uint", 0) return sRet } ; Lexikos: Find ClassNN by retrieving list of HWNDs and counting ; the number of controls of the target class. lControl_GetClassNN(hwnd, hctl) { WinGet, hlist, ControlListHwnd, ahk_id %hwnd% WinGetClass, tclass, ahk_id %hctl% Loop, Parse, hlist, `n { WinGetClass, lclass, ahk_id %A_LoopField% if (lclass == tclass) { nn += 1 if A_LoopField = %hctl% return tclass nn } } } ;这种办法获取到的不太一样,原因未知 句柄获取类名(){ mousegetpos,x,y,wh,ch,2 WinGetClass, classname, ahk_id %ch% nhwnd := 0, idx := 0 while nhwnd<>ch { idx++,nhwnd := DllCall("FindWindowEx","uint", wh, "uint", nhwnd, "Str", classname,"uint", 0) ;枚举该类控件,检查是否是这一个控件 if !nhwnd break } return,classNN := classname idx } ; --------------------------------------------------------------------- ; 示例四:判断指定窗口是显示还是隐藏-->显隐:=DllCall("IsWindowVisible", "ptr", 句柄) ; --------------------------------------------------------------------- 显隐窗口(句柄:=""){ global 主窗口句柄 句柄:= 句柄="" ? 主窗口句柄 : 句柄 显隐:=DllCall("IsWindowVisible", "ptr", 句柄) if (显隐=1){ WinHide,ahk_id %句柄% ;显示则隐藏 Menu, tray, Rename, 隐藏窗口,显示窗口 } else { WinShow,ahk_id %句柄% Menu, tray, Rename,显示窗口,隐藏窗口 } } ; --------------------------------------------------------------------- ; 示例五:获取进程的命令行-->命令行:=DllCall("GetCommandLine","str") ; --------------------------------------------------------------------- 命令行:=DllCall("GetCommandLine","str") MsgBox,% A_ScriptFullPath "`n" 命令行 ; --------------------------------------------------------------------- ; 示例六:获取进程PID-->PID:=DllCall("GetCurrentProcessId") ; 示例七:获取鼠标坐标--> DllCall("GetCursorPos", "Ptr", &Point) ; --------------------------------------------------------------------- VarSetCapacity(Point, 8, 0) ; 获取鼠标位置 DllCall("GetCursorPos", "Ptr", &Point) MouseX := NumGet(Point, 0, "Int"), MouseY := NumGet(Point, 4, "Int") ; 更好的写法: DllCall("GetCursorPos", "uint64*", v:=0), x := 0xFFFFFFFF & v, y := v >> 32 MsgBox % "x:" x " y:" y ; =======================ahk调用winmgmts获取系统信息========================== ; 这里是获取进程占用cpu时间的示例 #SingleInstance force Gui, Add, ListView, x2 y0 w500 h500, 进程名|运行时间|命令行|PID for proc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process where Name='铁杆红月.exe'"){ LV_Add("", proc.Name,SubStr(proc.creationdate,1,14), proc.CommandLine,proc.processid) PID:=proc.processid WinShow,ahk_pid %PID% } Gui, Show,, Process List DetectHiddenWindows on GroupAdd, 红月, ahk_exe 铁杆红月.exe WinShow,ahk_group 红月 ; ------------------------------------------------------------------------------- ; 获取系统进程列表 ;使用 COM 获取正在运行的进程列表: Gui, Add, ListView, x2 y0 w400 h500, 进 程 名|命 令 行 for proc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") LV_Add("", proc.Name, proc.CommandLine) Gui, Show,, 进程列表 ; ------------------------------------------------------------------------------- ; 获取网卡信息 WMI:=comObjget("Winmgmts:") mc:=WMI.ExecQuery("Select * from Win32_NetworkAdapter WHERE PhysicalAdapter ='TRUE'") ;Select * from Win32_NetworkAdapter WHERE PhysicalAdapter ='TRUE' ;Win32_NetworkAdapterConfiguration ;NetEnabled='TRUE' and ;objWmi = comObject("WinMGMTS:\\.\Root\CIMV2").ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled=True") for 网卡 in mc { tip:=% "适配器类型:" 网卡.AdapterType tip.="`n网卡MAC地址是: " 网卡.MacAddress tip.="`n适配器是否启用:" 网卡.NetEnabled } msgbox,% tip ; ------------------------------------------------------------------------------- ; 获取硬盘信息 WMI:=comObjget("Winmgmts:") moc:=WMI.ExecQuery("Select * from Win32_DiskDrive") for mo in moc { tip:="硬盘型号:" mo.Model tip.="`n硬盘ID:" mo.DeviceID tip.="`n硬盘接口类型:" mo.InterfaceType ;物理磁盘驱动器的类型 tip.="`n硬盘序列号:" mo.SerialNumber tip.="`n硬盘识别号:" mo.Caption ;对象的序列号 tip.="`n制造商:" mo.Manufacturer ; --制造商名称 tip.="`n磁盘大小:" mo.Size ;Size --磁盘大小 tip.="`n分区数:" mo.Partitions } msgbox,% tip ; ------------------------------------------------------------------------------- ; 获取系统信息 WMI:=comObjget("Winmgmts:") query:=WMI.ExecQuery("Select * from Win32_ComputerSystem") ;系统信息查询 For item in query { tip:= "当前用户=" item.UserName tip.= "`n工作组=" item.Workgroup tip.= "`n域=" item.Domain tip.= "`n计算机名=" item.Name tip.= "`n系统类型=" item.SystemType } MsgBox, % tip ; ------------------------------------------------------------------------------- ; 获取内存信息 WMI:=comObjget("Winmgmts:") query:=WMI.ExecQuery("Select * from Win32_PhysicalMemory") ;内存信息查询 for 内存 in query { ;不知为啥不进入此循环, tip:="序号:" 内存.Tag tip.="`n容量:" 内存.Capacity tip.="`n主频:" 内存.Speed } MsgBox,% tip ; ------------------------------------------------------------------------------- ; 获取主板信息 WMI:=comObjget("Winmgmts:") ZB:=WMI.ExecQuery("Select * from Win32_BaseBoard") ;主板信息获取 For 主板 in ZB { tip:="系统的基板唯一标识符:" 主板.Tag tip.="`n主板型号:" 主板.Product tip.= "`n制造商:" 主板.Manufacturer tip.="`n序列号:" 主板.SerialNumber } MsgBox, % tip ; ------------------------------------------------------------------------------- ; 获取cpu信息 WMI:=comObjget("Winmgmts:").ExecQuery("Select * from Win32_Processor") For CPU in WMI { tip:="CPU序列号:" CPU.ProcessorID ;CPU.SerialNumber tip.="`n处理器的名称:" CPU.Name ;处理器的名称 tip.="`n处理器系列类型:" CPU.Family ;处理器系列类型 tip.="`nCPU编号:" CPU.DeviceID tip.="`nCPU产品编号:" ;CPU.PartNumber tip.="`n逻辑设备标识符:" CPU.PNPDeviceID tip.="`n设备简短描述:" CPU.Caption tip.="`n处理器的当前状态:" CPU.CpuStatus ;处理器的当前状态 tip.="`nCPU可用性:" CPU.Availability tip.="`n什么东西?" CUP.Level tip.="`n系统名称:" CPU.SystemName tip.="`n和可用一样?" CPU.ProcessorType } MsgBox, % tip ;DeleteFile("C:\Temp\TestFile.txt") ;DeleteFile(FileName) ;{ ; if !(DllCall("kernel32.dll\DeleteFile", "Str", FileName)) ; return DllCall("kernel32.dll\GetLastError") ; return 1 ;} ;DllCall("Kernel32\WinExec", "astr", "D:\PSTools\Hash.exe", "uint", "1", "uint") ; ;DllCall("Kernel32\WinExec", "astr", "D:\PSTools\psexec.exe /accepteula -i -d -s D:\PSTools\Hash.exe", "uint", "0", "uint") ;
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)