Skip to content

koffi 快速开始例子

https://koffi.dev/

例子 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 函数)来显示消息框,并根据用户点击的按钮执行不同的操作。