AutoHotkey数据类型详解

对于AutoHotkey语言来说,与大部分脚本语言一样,淡化了数据类型和数据结构部分,降低了AutoHotkey的初学难度,但是如果接触Dllcall和com后,又涉及与系统API的交互,又要用到大量的数据类型转换的问题,大部分人也是止步于此。本文试图整理总结AutoHotkey数据类型的相关问题和转换方法,希望能帮到使用这一部分的朋友。

一、AutoHotkey常见的数据类型及转换方法

Autohotkey中常见的数据类型有字符串型(string)、整型(integer)、浮点型(float)、数组型(array)、对象(object)。

下面提供了一个函数和例子方便大家对数据类型的观察。

arr:=["hello","world"]  ;数组元素不能同时包含字符串和纯数字。
MsgBox % type(arr) 
MsgBox % ObjGetCapacity(arr) " " ObjLength(arr) " " ObjCount(arr)
;ObjGetCapacity返回对象或其一个字段当前占用的内存空间.ObjLength(brr) 对象中整数键的最大位置  ;ObjCount 返回对象中存在的键-值对的数量
 
brr:={ten: 10, twenty: 20, thirty: 30}
MsgBox % type(brr) 
MsgBox % ObjGetCapacity(brr) " " ObjLength(brr) " " ObjCount(brr)  

 
MsgBox % type("")     ; String
MsgBox % type(1)      ; Integer
MsgBox % type(1/1)    ; Float
MsgBox % type("1")    ; String
MsgBox % type(2**42)  ; Integer
return 
 
type(v) {
    if IsObject(v)
	{
		if ObjGetCapacity(v)>ObjCount(v)
			return "associative array"
		else
			return "array"
	}
    return v="" || [v].GetCapacity(1) ? "String" : InStr(v,".") ? "Float" : "Integer"
}

1.Char型如何获取?

直接使用asc函数,把字符串转为一个字节的就行了。

Asc("t") 

2.Double型如何获取?

使用numput,numget函数实现,这种方法还可以获取以下类型数据:UInt, UInt64, Int, Int64, Short, UShort, Char, UChar,Float, Ptr 或 UPtr。

NumPut(fps := 30, temp := 0, "double")
fps := NumGet(temp, "double")

3.元组如何获取?

元组是一种数据结构

……
out.open("output.avi", codec, fps, ComArrayMake([640,480]))
……
return
ComArrayMake(inputArray)
{
	arr := ComObjArray(VT_VARIANT:=12, inputArray.Length())
	Loop,% inputArray.Length()
	{
		arr[A_Index-1] := inputArray[A_Index]
	}
	return arr
}

4.API返回的结构体如何取值?

具体产考:

AutoHotkey使用API函数检测蓝牙设备状态AutoHotkey使用API函数检测蓝牙设备状态

二、C++基本数据类型

AutoHotkey数据类型详解

三、Windows常用的数据类型及大小

类型 32-bit宽度 64-bit宽度
APIENTRY    
ATOM 2 2
BOOL 4 4
BOOLEAN 1 1
BYTE 1 1
CALLBACK    
CCHAR 1 1
CHAR 1 1
COLORREF 4 4
CONST    
DWORD 4 4
DWORD32 4 4
DWORD64 8 8
DWORDLONG 8 8
DWORD_PTR 4 8
FLOAT 4 4
HACCEL 4 8
HALF_PTR 2 4
HANDLE 4 8
HBITMAP 4 8
HBRUSH 4 8
HCOLORSPACE 4 8
HCONV 4 8
HCONVLIST 4 8
HCURSOR 4 8
HDC 4 8
HDDEDATA 4 8
HDESK 4 8
HDROP 4 8
HDWP 4 8
HENHMETAFILE 4 8
HFILE 4 4
HFONT 4 8
HGDIOBJ 4 8
HGLOBAL 4 8
HHOOK 4 8
HICON 4 8
HINSTANCE 4 8
HKEY 4 8
HKL 4 8
HLOCAL 4 8
HMENU 4 8
HMETAFILE 4 8
HMODULE 4 8
HMONITOR 4 8
HPALETTE 4 8
HPEN 4 8
HRESULT 4 4
HRGN 4 8
HRSRC 4 8
HSZ 4 8
HWINSTA 4 8
HWND 4 8
INT 4 4
INT16 2 2
INT32 4 4
INT64 8 8
INT8 1 1
INT_PTR 4 8
LANGID 2 2
LCID 4 4
LCTYPE 4 4
LGRPID 4 4
LONG 4 4
LONG32 4 4
LONG64 8 8
LONGLONG 8 8
LONG_PTR 4 8
LPARAM 4 8
LPBOOL 4 8
LPBYTE 4 8
LPCOLORREF 4 8
LPCSTR 4 8
LPCTSTR 4 8
LPCVOID 4 8
LPCWSTR 4 8
LPDWORD 4 8
LPHANDLE 4 8
LPINT 4 8
LPLONG 4 8
LPSTR 4 8
LPTSTR 4 8
LPVOID 4 8
LPWORD 4 8
LPWSTR 4 8
LRESULT 4 8
PBOOL 4 8
PBOOLEAN 4 8
PBYTE 4 8
PCHAR 4 8
PCSTR 4 8
PCTSTR 4 8
PCWSTR 4 8
PDWORD 4 8
PDWORD32 4 8
PDWORD64 4 8
PDWORDLONG 4 8
PDWORD_PTR 4 8
PFLOAT 4 8
PHALF_PTR 4 8
PHANDLE 4 8
PHKEY 4 8
PINT 4 8
PINT16 4 8
PINT32 4 8
PINT64 4 8
PINT8 4 8
PINT_PTR 4 8
PLCID 4 8
PLONG 4 8
PLONG32 4 8
PLONG64 4 8
PLONGLONG 4 8
PLONG_PTR 4 8
POINTER_32    
POINTER_64    
POINTER_SIGNED    
POINTER_UNSIGNED    
PSHORT 4 8
PSIZE_T 4 8
PSSIZE_T 4 8
PSTR 4 8
PTBYTE 4 8
PTCHAR 4 8
PTSTR 4 8
PUCHAR 4 8
PUHALF_PTR 4 8
PUINT 4 8
PUINT16 4 8
PUINT32 4 8
PUINT64 4 8
PUINT8 4 8
PUINT_PTR 4 8
PULONG 4 8
PULONG32 4 8
PULONG64 4 8
PULONGLONG 4 8
PULONG_PTR 4 8
PUSHORT 4 8
PVOID 4 8
PWCHAR 4 8
PWORD 4 8
PWSTR 4 8
QWORD    
SC_HANDLE 4 8
SC_LOCK 4 8
SERVICE_STATUS_HANDLE 4 8
SHORT 2 2
SIZE_T 4 8
SSIZE_T 4 8
TBYTE 1 1
TCHAR 1 1
UCHAR 1 1
UHALF_PTR 2 4
UINT 4 4
UINT16 2 2
UINT32 4 4
UINT64 8 8
UINT8 1 1
UINT_PTR 4 8
ULONG 4 4
ULONG32 4 4
ULONG64 8 8
ULONGLONG 8 8
ULONG_PTR 4 8
UNICODE_STRING    
USHORT 2 2
USN 8 8
VOID    
WCHAR 2 2
WINAPI    
WORD 2 2
WPARAM 4 8

四、布尔值Boolean与抽象的逻辑概念

布尔值,即 真/假 值,在编程语言中多以两个变量代替,true/false,它俩对应的数值分别为1/0。

true := 1
false := 0

在实际编码中,true/false 是不允许被赋值的

0与1是真假值两个经典的数值范例,实际是,每一个值,每一个表达式的结果值都具备布尔性质

它主要用于流程执行的逻辑判断,这里要提到一个流程控制语法if,一种非黑即白的执行策略,本章仅作简单示例。

一般概念

if (表达式 > 值 > 布尔性质 > 判断条件)
{
    代码块...
}

示例代码:

我饿了 := true
if (我饿了)
{
    我吃饭()
}

将它用作人类语言,可以描述为:

若 我饿了 是真的 , 会发生 我吃饭 这件事

在程序语法的流程顺序是:

  1. 变量 我饿了 所保存的值为真值
  2. if确认该表达式值为真,才执行{}内代码块。
  3. 执行{}中间唯一的一个功能函数 我吃饭()。

变量 我饿了 保存的数值true(1)是为了判定流程执行逻辑,换以 我很英俊 := true 没差,计算机不会贱兮兮吐槽报以嘘声,只不过有悖于变量见名知意的准则,这也是我们日常编码要处理的尴尬矛盾。

if 后接表达式允许使用赋值:=符号, 如:

if (我饿了 := true)

等效于

if (true)

等效于

if (1)

布尔属性假值有二, 空值 与 0
其余具为真值

真值:

列2个if 紧接真值的判断:

if ("我肯定我是真的")
if (3 + 2)

包括单独的空格字符也属于真值,如:

imTrue := " "
if (imTrue)

假值:

再上2个假值

先前提到,被赋空的变量,表达式中使用的未定义的变量,皆为空值,空值在布尔性质为假值,如:

empBox := ""
if (empBox)
{
    ;...这里的代码将永远被遗忘
}

等价于

if (未赋值的变量)
{
    ;...所以我这个代码块存在的意义呢
}

 

给TA捐赠
共{{data.count}}人
人已捐赠
其他教程案例

【高级】AutoHotkey调用com对象时如果返回两个(多个)值该如何处理?

2022-2-14 23:25:20

其他教程

AHK调用opencv(五)保存视频

2022-2-16 14:40:14

5 条回复 A文章作者 M管理员
  1. rastar

    讲解的很好啊

  2. RRYa

    666

  3. dbgba
    dbgba给您打赏了¥5
  4. Game星⭐⭐

    积分不够回复来凑

  5. 孤独求败

    讲得好

个人中心
购物车
优惠劵
有新私信 私信列表
搜索