/*
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)