koffi 快速开始例子
例子 index.js
https://koffi.dev/start#for-windows
js
// ES6 syntax: import koffi from 'koffi';
const koffi = require("koffi");
// Load the shared library
const lib = koffi.load("user32.dll");
// Declare constants
const MB_OK = 0x0;
const MB_YESNO = 0x4;
const MB_ICONQUESTION = 0x20;
const MB_ICONINFORMATION = 0x40;
const IDOK = 1;
const IDYES = 6;
const IDNO = 7;
// Find functions
// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa
const MessageBoxA = lib.func("__stdcall", "MessageBoxA", "int", [
"void *",
"str",
"str",
"uint",
]);
const MessageBoxW = lib.func("__stdcall", "MessageBoxW", "int", [
"void *",
"str16",
"str16",
"uint",
]);
let ret = MessageBoxA(
null,
"Do you want another message box?",
"Koffi",
MB_YESNO | MB_ICONQUESTION
);
if (ret == IDYES) {
MessageBoxW(null, "Hello World!", "Koffi", MB_ICONINFORMATION);
}
给例子添加注释
javascript
// 使用 CommonJS 语法引入 koffi 模块(该模块用于加载和调用 C/C++ 共享库函数)。
const koffi = require("koffi");
// 加载 Windows 的 user32.dll 动态链接库(DLL),该库包含与用户界面相关的函数,如显示消息框等。
const lib = koffi.load("user32.dll");
// 定义消息框的选项常量:MB_OK 表示只有“确定”按钮
const MB_OK = 0x0;
// 定义消息框的选项常量:MB_YESNO 表示有“是”和“否”按钮
const MB_YESNO = 0x4;
// 定义消息框的图标常量:MB_ICONQUESTION 表示显示一个带问号的图标
const MB_ICONQUESTION = 0x20;
// 定义消息框的图标常量:MB_ICONINFORMATION 表示显示一个带信息的图标
const MB_ICONINFORMATION = 0x40;
// 定义 MessageBox 返回值常量:IDOK 表示用户点击“确定”按钮
const IDOK = 1;
// 定义 MessageBox 返回值常量:IDYES 表示用户点击“是”按钮
const IDYES = 6;
// 定义 MessageBox 返回值常量:IDNO 表示用户点击“否”按钮
const IDNO = 7;
// 定义 MessageBoxA 函数,__stdcall 是调用约定,MessageBoxA 是 user32.dll 中的 ANSI 编码版本消息框函数
// 参数类型是:void *(窗口句柄)、str(消息文本)、str(标题)、uint(消息框选项)
const MessageBoxA = lib.func("__stdcall", "MessageBoxA", "int", [
"void *", // 窗口句柄,可以为 null
"str", // 消息文本,ANSI 编码的字符串
"str", // 消息框标题,ANSI 编码的字符串
"uint", // 消息框选项,用于控制按钮和图标
]);
// 定义 MessageBoxW 函数,__stdcall 是调用约定,MessageBoxW 是 user32.dll 中的 Unicode 编码版本消息框函数
// 参数类型是:void *(窗口句柄)、str16(消息文本,UTF-16 编码)、str16(标题,UTF-16 编码)、uint(消息框选项)
const MessageBoxW = lib.func("__stdcall", "MessageBoxW", "int", [
"void *", // 窗口句柄,可以为 null
"str16", // 消息文本,UTF-16 编码的字符串
"str16", // 消息框标题,UTF-16 编码的字符串
"uint", // 消息框选项,用于控制按钮和图标
]);
// 调用 ANSI 编码的 MessageBoxA 函数,显示一个带有“是”和“否”按钮的消息框,并且有问号图标。
// 返回值保存在 ret 变量中,表示用户点击了哪个按钮。
let ret = MessageBoxA(
null, // 窗口句柄,这里设置为 null 表示没有父窗口
"Do you want another message box?", // 消息文本
"Koffi", // 消息框标题
MB_YESNO | MB_ICONQUESTION // 消息框选项,显示“是”和“否”按钮以及问号图标
);
// 判断用户是否点击了“是”按钮(返回值为 IDYES)
// 如果是,则调用 Unicode 编码的 MessageBoxW 函数,显示带有信息图标的消息框
if (ret == IDYES) {
MessageBoxW(
null, // 窗口句柄,设置为 null
"Hello World!", // 消息文本,使用 UTF-16 编码
"Koffi", // 消息框标题,使用 UTF-16 编码
MB_ICONINFORMATION // 消息框选项,显示信息图标
);
}
这个代码主要实现了通过 koffi
加载 Windows API(user32.dll
中的 MessageBox
函数)来显示消息框,并根据用户点击的按钮执行不同的操作。