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

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。