# Jscm-Core-FrameWork **Repository Path**: SnailcatMall/Jscm-Core-FrameWork ## Basic Information - **Project Name**: Jscm-Core-FrameWork - **Description**: Jscm框架是一个基于Java JNI的Windows系统操作框架,提供了丰富的Windows API封装,包括窗口操作、进程线程管理、内存操作、注册表操作、热键驱动等功能。本框架集成了三大模块进行处理,参考了精易模块、超级模块、乐易模块的设计思想,为Java开发者提供了强大的Windows系统底层操作能力。 框架支持X86和X64平台,包含DD键鼠驱动、幽灵键鼠驱动等硬件抽象层功能,同时提供了 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: https://www.snailcatmall.com/ - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2026-02-21 - **Last Updated**: 2026-03-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: Jscm-Core框架, JNI开源框架 ## README # JSCM 核心框架完全指南 ## 框架概述 **JSCM(Java System Control Management)** 是一套基于 Java JNI(Java Native Interface)技术构建的 Windows 系统底层操作框架。该框架为 Java 开发者提供了强大的 Windows 操作系统底层能力访问接口,涵盖了窗口管理、进程线程控制、内存操作、注册表读写、硬件驱动模拟等核心功能。JSCM 框架的设计参考了精易模块、超级模块、乐易模块等成熟产品的架构思想,旨在为 Java 语言在 Windows 平台上的系统级开发提供一站式解决方案。 JSCM 框架的核心优势在于其对底层 Windows API 的完整封装和对硬件驱动的高效调用。通过 JNI 桥接技术,Java 开发者无需编写复杂的本地代码,即可直接调用底层的 Windows 系统功能。框架支持 X86(32位)和 X64(64位)两大平台,能够满足不同架构应用程序的开发需求。此外,框架还集成了 CapStone 反汇编引擎,支持内存特征码搜索和反汇编分析功能,配合 DD 键鼠驱动、幽灵键鼠驱动等硬件抽象层功能,使得自动化脚本、游戏辅助工具、窗口管理工具等开发变得更加简便快捷。 --- ## 目录 - [框架概述](#框架概述) - [系统要求](#系统要求) - [快速开始](#快速开始) - [核心模块详解](#核心模块详解) - [ByteUtils 编码转换工具类](#byteutils-编码转换工具类) - [WindowOperationUtils 窗口操作工具类](#windowoperationutils-窗口操作工具类) - [SystemUtils 系统工具类](#systemutils-系统工具类) - [ProcessAndThreadUtils 进程线程工具类](#processandthreadutils-进程线程工具类) - [MemoryOperationUtilsX86/X64 内存操作工具类](#memoryoperationutilsx86x64-内存操作工具类) - [RegistryOperationUtilsX86/X64 注册表操作工具类](#registryoperationutilsx86x64-注册表操作工具类) - [键鼠驱动模块](#键鼠驱动模块) - [报表模块](#报表模块) - [回调接口](#回调接口) - [使用案例](#使用案例) - [常见问题](#常见问题) - [技术支持](#技术支持) --- ## 系统要求 ### 运行环境 JSCM 框架对运行环境有以下基本要求,确保这些条件满足是框架正常工作的前提。操作系统方面,框架支持 Windows 10、Windows 11 以及 Windows Server 2016 及以上版本。由于框架涉及大量的 Windows 本地 API 调用,因此仅支持在 Windows 操作系统上运行,Linux 和 macOS 平台无法使用。Java 运行时环境需要 JDK 1.8 或更高版本,建议使用 JDK 11 或 JDK 17 以获得最佳性能和稳定性。框架的 DLL 文件分为 32 位和 64 位两个版本,使用时需要注意 DLL 位数必须与 JDK 位数保持一致,否则会导致加载失败。 ### 内存配置 在进行大规模内存操作(如内存搜索、特征码扫描)时,可能需要调整 Java 虚拟机的内存参数。建议在运行参数中添加以下配置,以确保框架在高负荷场景下的稳定运行。这些参数能够有效避免因内存不足导致的 OutOfMemoryError 问题,同时关闭 GC Overhead 限制以适应长时间运行的系统操作任务。 ```bash -encoding utf-8 -charset utf-8 -XX:-UseGCOverheadLimit -Xms1T -Xmx1T -XX:MaxPermSize=1T ``` ### 依赖配置 在使用 JSCM 框架前,需要正确配置框架的 DLL 路径。框架通过 PathFileJSCM 类来管理 DLL 文件的加载路径,开发者需要在代码初始化阶段指定正确的路径。以下是开发环境和生产环境的配置示例,开发者应根据实际部署情况选择合适的配置方式。 **开发环境配置:** ```java PathFileJSCM.setDebugFile32("C:\\Users\\www10\\IdeaProjects\\scmJnaApi\\JscmFunction\\Jscm\\_int\\Jscm\\release\\win32\\linker\\"); PathFileJSCM.setDebugFile64("G:\\Users\\www10\\IdeaProjects\\scmJnaApi\\JscmFunction\\Jscm\\_int\\Jscm\\release\\x64\\linker\\"); PathFileJSCM.setIsDebug(true); ``` **生产环境配置:** ```java PathFileJSCM.setDebugFile32(PathFileJSCM.getJarPath() + "demo\\x86\\"); PathFileJSCM.setDebugFile64(PathFileJSCM.getJarPath() + "demo\\x64\\"); PathFileJSCM.setIsDebug(false); ``` --- ## 快速开始 为了让开发者能够快速上手 JSCM 框架,本节提供一个完整的示例项目创建流程。从环境搭建到第一个功能调用,逐步引导开发者完成框架的集成和使用。 ### 步骤一:创建 Maven 项目 首先创建一个标准的 Maven 项目,并在 pom.xml 文件中添加 JSCM 框架的依赖。如果框架尚未发布到 Maven 中央仓库,需要将框架的 JAR 包安装到本地仓库或搭建私有仓库。 ```xml 4.0.0 com.scm jscm-core-framework 1.2.8 jar UTF-8 1.8 1.8 ``` ### 步骤二:初始化框架 在应用程序启动时,初始化 JSCM 框架并加载必要的 DLL 文件。初始化操作通常放在 main 方法或应用启动类的静态代码块中执行。 ```java import com.scm.all.export.PathFileJSCM; public class App { static { // 初始化 JSCM 框架 String jarPath = SystemUtils.runFilePath(); PathFileJSCM.setDebugFile32(jarPath + "demo\\x86\\"); PathFileJSCM.setDebugFile64(jarPath + "demo\\x64\\"); PathFileJSCM.setIsDebug(true); System.out.println("JSCM 框架初始化完成"); } public static void main(String[] args) { // 应用程序代码 } } ``` ### 步骤三:调用框架功能 框架初始化完成后,即可调用各类工具类完成系统操作任务。以下示例展示了如何查找窗口并获取其信息,帮助开发者理解框架的基本使用流程。 ```java import com.scm.all.export.WindowOperationUtils; import com.scm.all.export.SystemUtils; public class QuickStartDemo { public static void main(String[] args) { try { // 获取桌面窗口句柄 long desktopHwnd = WindowOperationUtils.windowGetDesktopWindow(); System.out.println("桌面窗口句柄: " + desktopHwnd); // 查找指定窗口 int notepadHwnd = WindowOperationUtils.windowGetHwndTow(0, "Notepad", "无标题 - 记事本"); if (notepadHwnd != 0) { System.out.println("找到记事本窗口,句柄: " + notepadHwnd); // 获取窗口标题 String title = WindowOperationUtils.windowGetTitle(notepadHwnd); System.out.println("窗口标题: " + title); // 获取窗口类名 String className = WindowOperationUtils.windowGetClassName(notepadHwnd); System.out.println("窗口类名: " + className); // 获取窗口位置和大小 int[] rect = WindowOperationUtils.windowGetRectToSize(notepadHwnd); System.out.println("窗口位置: x=" + rect[0] + ", y=" + rect[1] + ", 宽度=" + rect[2] + ", 高度=" + rect[3]); } } catch (Exception e) { e.printStackTrace(); } } } ``` --- ## 核心模块详解 JSCM 框架按照功能特性划分为多个核心模块,每个模块专注于特定的系统操作领域。以下是各模块的详细说明,包含完整的接口列表和使用示例。 ### ByteUtils 编码转换工具类 ByteUtils 是 JSCM 框架中最基础的工具类之一,提供了各种数据类型与字节数组之间的转换功能。该类支持多种编码格式的相互转换,包括 UTF-8、Unicode、ASCII、UTF-16 等,是进行底层数据处理不可或缺的工具。在内存操作、网络通信、文件处理等场景中,字节数组与Java数据类型之间的转换极为频繁,ByteUtils 类极大简化了这些操作。 #### 数值类型转换 ByteUtils 提供了完善的基本数据类型与字节数组相互转换功能,覆盖了 int、long、short、double、float、char 等常用类型。所有转换方法都考虑了字节序问题,默认使用小端序(Little Endian)进行转换,这与 Windows 系统的字节序一致。 ```java import com.scm.all.export.ByteUtils; // int 类型转换 int intValue = 12345678; byte[] intBytes = ByteUtils.intToBytesArray(intValue); // int 转 byte[] int resultInt = ByteUtils.bytesArrayToInt(intBytes); // byte[] 转 int // long 类型转换 long longValue = 9876543210L; byte[] longBytes = ByteUtils.longToBytesArray(longValue); // long 转 byte[] long resultLong = ByteUtils.bytesArrayToLong1(longBytes); // byte[] 转 long // short 类型转换 short shortValue = 32000; byte[] shortBytes = ByteUtils.shortToBytesArray(shortValue); // short 转 byte[] short resultShort = ByteUtils.bytesArrayToShort1(shortBytes); // byte[] 转 short // double 类型转换 double doubleValue = 3.1415926; byte[] doubleBytes = ByteUtils.doubleToBytesArray(doubleValue); // double 转 byte[] double resultDouble = ByteUtils.bytesArrayToDouble1(doubleBytes); // byte[] 转 double // float 类型转换 float floatValue = 3.14f; byte[] floatBytes = ByteUtils.floatToBytesArray(floatValue); // float 转 byte[] float resultFloat = ByteUtils.bytesArrayToFloat1(floatBytes); // byte[] 转 float ``` #### 编码转换方法 在处理 Windows 应用程序时,经常需要处理各种字符串编码格式。ByteUtils 提供了全面的编码转换支持,能够满足不同场景下的编码需求。这些方法在窗口标题获取、进程名称处理、内存数据解析等场景中广泛使用。 ```java // UTF-8 宽字符串转换(常用) String utf8String = "Hello World 你好世界"; byte[] utf8Bytes = ByteUtils.utf8ToBytesArray(utf8String); String resultUtf8 = ByteUtils.bytesArrayToUtf8(utf8Bytes); // Unicode 编码转换 byte[] unicodeBytes = ByteUtils.utf8ToUniCodeArray(utf8String); String resultUnicode = ByteUtils.uniCodeArrayToUtf8(unicodeBytes); // UTF-16 宽字符串转换 byte[] utf16Bytes = "测试字符串".getBytes(java.nio.charset.StandardCharsets.UTF_16LE); String resultUtf16 = ByteUtils.bytesArrayUTF16ToWideString(utf16Bytes, true); // ASCII 宽字符串转换 byte[] asciiBytes = ByteUtils.asciiWideStringToBytesArray("Test String"); String resultAscii = ByteUtils.bytesArrayToAsciiWideString(asciiBytes); ``` #### 进制转换方法 进制转换在内存地址处理、特征码扫描、调试分析等场景中使用频繁。ByteUtils 提供了完整的进制转换功能,支持十进制、十六进制、二进制之间的相互转换。 ```java // 整数转十六进制字符串 int intValue = 255; String hexString = ByteUtils.intToHexString(intValue); // "FF" String hexStringWithPrefix = ByteUtils.intToHex(intValue); // "0xFF" // 十六进制字符串转字节数组 String hexStr = "48 65 6C 6C 6F"; byte[] hexBytes = ByteUtils.hexStrToBytes(hexStr); // 空格可分隔 // 字节数组转十六进制字符串 byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; String hexResult = ByteUtils.bytesToHexString(data); // "48656C6C6F" // 十六进制字符串转整数 String hexNum = "FF"; int decimalValue = ByteUtils.hexStrToInt1(hexNum); // 255 // 长整型十六进制转换 String longHex = "FFFFFFFF"; long longValue = ByteUtils.hexToLong1(longHex); ``` #### 字节数组操作方法 字节数组操作是底层编程的基础,ByteUtils 提供了丰富的数组处理功能,包括数组查找、截取、合并、比较等操作。这些方法在数据解析、协议处理、文件操作等场景中非常实用。 ```java // 字节数组查找 byte[] mainArray = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; byte[] searchArray = {0x03, 0x04}; int index = ByteUtils.indexOf(mainArray, searchArray, 0); // 返回找到的位置 // 字节数组截取 byte[] leftArray = ByteUtils.subByteLeftArray(mainArray, 3); // 取左边3个字节 byte[] midArray = ByteUtils.subByteArray(mainArray, 1, 3); // 取中间字节 // 字节数组合并 byte[] array1 = {0x01, 0x02}; byte[] array2 = {0x03, 0x04}; byte[] mergedArray = ByteUtils.byteMerger(array1, array2); // 合并两个数组 // 字节数组比较 boolean isEqual = ByteUtils.equalsByteArray(array1, array2); // 比较是否相等 // 字符数组查找 char[] mainChars = {'A', 'B', 'C', 'D', 'E'}; char[] searchChars = {'C', 'D'}; int charIndex = ByteUtils.indexOf(mainChars, searchChars, 0); ``` #### 特征码搜索方法 特征码搜索是游戏辅助和软件安全分析中的核心技术,ByteUtils 提供了基于十六进制特征码的内存搜索功能。通过特征码定位,可以快速找到目标程序中的关键代码位置。 ```java // 特征码匹配 byte[] memoryData = {0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x40, 0x53}; byte[] signature = ByteUtils.hexMd5ToBytesArrays("55 8B EC ?? 83 EC ?? 53"); // ? 表示任意字节 // 特征码索引搜索 int sigIndex = ByteUtils.hexToMd5BytesIndex(memoryData, signature); if (sigIndex >= 0) { System.out.println("特征码位置偏移: " + sigIndex); } // 特征码匹配验证 boolean matched = ByteUtils.hexToMd5BytesMatches(memoryData, signature); ``` #### 字符串搜索算法 ByteUtils 实现了多种经典的字符串搜索算法,包括 Sunday 算法、BF(暴力匹配)算法、KMP 算法等。不同的算法在不同的数据规模和模式特点下表现各异,开发者可以根据实际需求选择合适的算法。 ```java String text = "ABABABCDABCDABCD"; String pattern = "ABCD"; // Sunday 算法(效率最高) int sundayIndex = ByteUtils.sundayString(text, pattern); // BF 算法(暴力匹配) int bfIndex = ByteUtils.bfString(text, pattern); // KMP 算法(预处理O(m),匹配O(n)) int kmpIndex = ByteUtils.kmpString(text, pattern); // 字节数组搜索 byte[] byteText = {0x01, 0x02, 0x03, 0x04, 0x05}; byte[] bytePattern = {0x03, 0x04}; int byteIndex = ByteUtils.sundayByteIndex(byteText, bytePattern, 0); ``` --- ### WindowOperationUtils 窗口操作工具类 WindowOperationUtils 是 JSCM 框架中功能最为庞大的模块之一,提供了全面的 Windows 窗口操作能力。该类封装了 Windows API 中的窗口管理功能,支持窗口查找、属性获取与设置、位置调整、样式修改等操作。无论是自动化测试工具、界面辅助工具还是游戏辅助软件,窗口操作都是核心功能之一。 #### 窗口基础操作 窗口基础操作涵盖了窗口句柄获取、窗口状态控制、窗口标题和类名管理等基本功能。通过这些接口,开发者可以获取系统中任意窗口的信息,并对其进行各种控制操作。 ```java import com.scm.all.export.WindowOperationUtils; import com.scm.all.enumBox.WindowStyle; // 获取桌面窗口句柄 long desktopHwnd = WindowOperationUtils.windowGetDesktopWindow(); System.out.println("桌面窗口句柄: " + desktopHwnd); // 获取光标位置 int[] caretPos = WindowOperationUtils.windowGetCaretPos(); System.out.println("光标位置: x=" + caretPos[0] + ", y=" + caretPos[1]); // 窗口是否响应(检测窗口是否响应消息) boolean isResponsive = WindowOperationUtils.windowSendMessageTimeoutW(notepadHwnd); System.out.println("窗口是否响应: " + isResponsive); // 窗口重绘 WindowOperationUtils.windowInvalidateRect(notepadHwnd); // 枚举循环关闭窗口 WindowOperationUtils.enumWindowClose("Notepad"); ``` #### 窗口查找方法 窗口查找是窗口操作中最常用的功能之一,JSCM 提供了多种查找方式,包括精确查找、模糊查找、进程内查找等。这些方法能够满足不同场景下的窗口定位需求。 ```java // 精确查找窗口(进程ID + 类名 + 标题) int hwnd1 = WindowOperationUtils.windowGetHwndTow(0, "Notepad", "无标题 - 记事本"); // 模糊查找窗口(只匹配类名) int hwnd2 = WindowOperationUtils.windowGetHwndOne(0, "Notepad"); // 通过坐标查找窗口 int hwndAtPoint = WindowOperationUtils.windowGetPoint(100, 100); // 暴力枚举句柄(遍历所有窗口) int[] allHwnds = WindowOperationUtils.constraintGetHwnd(); for (int hwnd : allHwnds) { String title = WindowOperationUtils.windowGetTitle(hwnd); if (title != null && !title.isEmpty()) { System.out.println("窗口: " + title + " -> 句柄: " + hwnd); } } // 获取 Swing 窗口句柄 int swingHwnd = WindowOperationUtils.SwingWindowsHwnd(); // 枚举所有子窗口 int[] childHwnds = WindowOperationUtils.WindowEnum(notepadHwnd); ``` #### 窗口属性操作 窗口属性包括标题、类名、透明度、状态(最大、最小、正常)等。通过属性操作接口,可以获取和修改窗口的各种属性,实现窗口状态的动态控制。 ```java // 获取窗口标题 String title = WindowOperationUtils.windowGetTitle(notepadHwnd); System.out.println("窗口标题: " + title); // 设置窗口标题 WindowOperationUtils.windowSetTitle(notepadHwnd, "新标题"); // 获取窗口类名 String className = WindowOperationUtils.windowGetClassName(notepadHwnd); System.out.println("窗口类名: " + className); // 获取窗口控件ID int ctrlId = WindowOperationUtils.windowGetDlgCtrlID(notepadHwnd); // 控件ID取窗口句柄 int buttonHwnd = WindowOperationUtils.windowGetDlgItem(notepadHwnd, 1234); // 设置窗口透明度(0-255,255为不透明) WindowOperationUtils.windowSetAlpha(notepadHwnd, 200); // 窗口激活 WindowOperationUtils.windowActivation(notepadHwnd); // 窗口置顶 WindowOperationUtils.windowTop(notepadHwnd, true); // 窗口最大化 WindowOperationUtils.windowSetMaximize(notepadHwnd); // 窗口最小化 WindowOperationUtils.windowSetMinimize(notepadHwnd); // 窗口还原 WindowOperationUtils.windowReduction(notepadHwnd); // 关闭窗口 WindowOperationUtils.windowClose(notepadHwnd); // 窗口置焦点 WindowOperationUtils.windowSetFocus(notepadHwnd); ``` #### 窗口位置操作 窗口位置操作允许开发者精确控制窗口的位置和大小。通过这些接口,可以实现窗口的移动、调整大小、对齐等功能,在自动化测试和界面布局调整等场景中非常有用。 ```java // 获取窗口位置和大小 int[] rect = WindowOperationUtils.windowGetRectToSize(notepadHwnd); // rect[0]=x, rect[1]=y, rect[2]=width, rect[3]=height // 设置窗口位置和大小 WindowOperationUtils.windowSetLocationSize(notepadHwnd, 100, 100, 800, 600); // 获取子窗口屏幕坐标 int[] childPos = WindowOperationUtils.GetChildScreenPos(notepadHwnd); // 设置子窗口位置 WindowOperationUtils.SetChildScreenPos(notepadHwnd, 50, 50); // 坐标转换:客户端坐标转屏幕坐标 int[] screenPos = WindowOperationUtils.ClientToScreenPos(notepadHwnd, 100, 100); // 坐标转换:屏幕坐标转客户端坐标 int[] clientPos = WindowOperationUtils.ScreenToClientPos(notepadHwnd, 500, 500); // 获取客户端坐标 int[] clientPoint = WindowOperationUtils.getClientPoint(notepadHwnd); ``` #### 窗口嵌入技术 窗口嵌入是高级窗口操作技术,允许将一个窗口嵌入到另一个窗口中显示。JSCM 支持将窗口嵌入到桌面或其他窗口中,实现各种特殊的界面效果。 ```java // 嵌入桌面 WindowOperationUtils.windowEmbeddedDesktop(notepadHwnd); // 嵌入指定窗口 int parentHwnd = 12345678; // 父窗口句柄 WindowOperationUtils.WindowEmbeddedWindow(notepadHwnd, parentHwnd); // 获取桌面 WorkerW 句柄 long workerW = WindowOperationUtils.GetWorkerW(); // 窗口置父 WindowOperationUtils.windowSetParent(notepadHwnd, parentHwnd); ``` #### 窗口枚举方法 窗口枚举用于遍历系统中所有窗口或指定窗口的子窗口。通过枚举操作,可以获取窗口列表、查找特定窗口、分析窗口结构等。 ```java // 枚举所有子窗口句柄 int[] childWindows = WindowOperationUtils.WindowEnum(parentHwnd); // 获取子窗口类名 String childClassName = WindowOperationUtils.WindowEnumChildWindowClassName(parentHwnd, 0); // 获取子窗口标题 String childTitle = WindowOperationUtils.WindowEnumChildWindowTitleName(parentHwnd, 0); // 获取窗体控件坐标 int[] componentXY = WindowOperationUtils.windowGetcomponentXY(parentHwnd, "Button", "确定"); ``` --- ### SystemUtils 系统工具类 SystemUtils 提供了系统级别的工具功能,包括热键监视、全局钩子、剪贴板操作、消息框、系统路径获取等。这些功能是构建系统级应用的基础,在自动化脚本、监控工具、快捷键应用等开发中不可或缺。 #### 系统路径方法 系统路径方法用于获取各种系统和用户目录的路径,这些路径在文件操作、配置管理等场景中经常需要使用。 ```java import com.scm.all.export.SystemUtils; // 获取桌面路径 String desktopPath = SystemUtils.getDesktop(); System.out.println("桌面路径: " + desktopPath); // 获取自身启动目录 String runPath = SystemUtils.getRunPathOne(); System.out.println("启动目录: " + runPath); // 获取 System32 系统目录 String system32Path = SystemUtils.System32Path(); System.out.println("System32路径: " + system32Path); // 获取系统目录 String systemPath = SystemUtils.getSystemPath(); System.out.println("系统目录: " + systemPath); // 返回 jar 运行目录 String jarPath = SystemUtils.runFilePath(); System.out.println("JAR目录: " + jarPath); ``` #### 消息框方法 消息框是 Windows 系统中最基本的用户交互方式,JSCM 提供了创建各种类型消息框的功能。 ```java // 弹出信息消息框 SystemUtils.messageBoxExW(0, "操作完成!", "提示", com.scm.all.enumBox.MessageBoxFlag.MB_OK | com.scm.all.enumBox.MessageBoxFlag.MB_ICONINFORMATION); // 弹出确认消息框 int result = SystemUtils.messageBoxExW(0, "确定要执行此操作吗?", "确认", com.scm.all.enumBox.MessageBoxFlag.MB_YESNO | com.scm.all.enumBox.MessageBoxFlag.MB_ICONQUESTION); if (result == 6) { // IDYES System.out.println("用户点击了确定"); } else { System.out.println("用户点击了取消"); } ``` #### 热键监视方法 热键监视允许应用程序捕获全局快捷键组合,实现后台快捷键响应功能。这在需要全局响应用户操作的场景中非常有用。 ```java import com.scm.all.export.SystemUtils; import com.scm.all.pfunc.ResponseEventCallBack; // 创建热键监视回调 ResponseEventCallBack hotkeyCallback = new ResponseEventCallBack() { @Override public void responseEvent(int id, int param) { System.out.println("检测到热键: ID=" + id + ", 参数=" + param); } }; // 监视单个热键(Ctrl+Shift+A) int hotkeyId = 1; SystemUtils.listeningHotKeyOne(0, hotkeyId, com.scm.all.enumBox.WindowFieldOffsets.MOD_CONTROL | com.scm.all.enumBox.WindowFieldOffsets.MOD_SHIFT, 0x41, hotkeyCallback); // 监视组合热键(Ctrl+Alt+Delete) int hotkeyId2 = 2; SystemUtils.listeningHotKeyTow(0, hotkeyId2, com.scm.all.enumBox.WindowFieldOffsets.MOD_CONTROL, com.scm.all.enumBox.WindowFieldOffsets.MOD_ALT, 0x44, hotkeyCallback); // 卸载热键 SystemUtils.removeListeningHotKeyOne(hotkeyId); SystemUtils.removeListeningHotKeyTow(hotkeyId2); ``` #### 键盘钩子方法 全局键盘钩子能够捕获系统中所有的键盘输入事件,常用于键盘记录、快捷键拦截、输入模拟等场景。 ```java import com.scm.all.pfunc.KeyCodeCallBack; // 创建键盘回调 KeyCodeCallBack keyCallback = new KeyCodeCallBack() { @Override public void keyEvent(int code, int wParam, int lParam) { if (code >= 0) { // wParam 包含虚拟键码 String keyText = SystemUtils.keyCodeToStringOne(wParam); System.out.println("按键: " + keyText + ", 代码: " + wParam); } } }; // 安装全局键盘钩子 int hookId = SystemUtils.setWindowsHookEx(keyCallback); // 消息循环(需要持续运行) // SystemUtils.messageRun(); // 卸载全局钩子 if (hookId != 0) { SystemUtils.unhookWindowsHookEx(hookId); } ``` #### 鼠标操作方法 鼠标操作方法提供了模拟鼠标点击、移动、滚轮等行为的能力,是自动化工具的核心功能之一。 ```java // 格式化屏幕坐标 int[] formatted = SystemUtils.getScreenXY(100, 200); System.out.println("格式化坐标: x=" + formatted[0] + ", y=" + formatted[1]); // 获取屏幕坐标X int mouseX = SystemUtils.mouseX(); // 模拟鼠标左键点击(绝对坐标) SystemUtils.mouseClickOne(500, 500); // 模拟鼠标左键点击(窗口内相对坐标) int windowHwnd = 12345678; SystemUtils.mouseClickTwo(windowHwnd, 100, 100); // 后台模拟鼠标消息 com.scm.all.struct.TagINPUT[] inputs = new com.scm.all.struct.TagINPUT[1]; // 设置输入结构体 SystemUtils.sendInput(1, inputs); ``` #### 文件对话框方法 文件对话框方法封装了 Windows 原生的文件选择器,支持单文件选择、多文件选择、文件保存、文件夹选择等功能。 ```java // 文件选择器 String selectedFile = SystemUtils.OpenFileDialog(0, "所有文件(*.*)|*.*|文本文件(*.txt)|*.txt"); System.out.println("选择文件: " + selectedFile); // 文件多选选择器 String[] selectedFiles = SystemUtils.OpenFilesDialog(0, "所有文件(*.*)|*.*"); for (String file : selectedFiles) { System.out.println("选择的文件: " + file); } // 文件保存选择器 String savePath = SystemUtils.SaveFileDialog(0, "所有文件(*.*)|*.*", "report.pdf"); System.out.println("保存路径: " + savePath); // 文件夹选择器 String directory = SystemUtils.DirectoryDialog(0, "选择文件夹"); System.out.println("选择目录: " + directory); ``` --- ### ProcessAndThreadUtils 进程线程工具类 ProcessAndThreadUtils 提供了进程和线程相关的操作功能,是进行进程管理、模块枚举、权限提升等操作的核心工具类。在系统监控、进程注入、权限分析等场景中,这些功能至关重要。 #### 进程操作方法 进程操作允许开发者枚举系统进程、获取进程信息、结束进程等。这些功能在进程管理工具、安全分析软件、任务管理器等应用中广泛使用。 ```java import com.scm.all.export.ProcessAndThreadUtils; import com.scm.all.struct.TagProcessenTry32; import java.util.List; // 枚举系统进程 List processes = ProcessAndThreadUtils.processEnumInfo(); for (TagProcessenTry32 process : processes) { System.out.println("进程: " + process.szExeFile + " PID: " + process.th32ProcessID + " 父PID: " + process.th32ParentProcessID); } // 获取当前进程PID int currentPid = ProcessAndThreadUtils.getCurrentProcessPID(); System.out.println("当前进程PID: " + currentPid); // 进程PID取进程名 String processName = ProcessAndThreadUtils.pidGetProcessName(1234); System.out.println("PID 1234 对应的进程名: " + processName); // 进程名取PID int pid = ProcessAndThreadUtils.processNameGetPid("notepad.exe"); System.out.println("notepad.exe 的PID: " + pid); // 进程名是否存在 boolean exists = ProcessAndThreadUtils.processNameIsTrue("notepad.exe"); System.out.println("notepad.exe 是否存在: " + exists); // 打开进程 int processHandle = ProcessAndThreadUtils.openProcess(pid); System.out.println("进程句柄: " + processHandle); // 结束进程 ProcessAndThreadUtils.overProcess(pid); System.out.println("进程已结束"); // 关闭进程句柄 ProcessAndThreadUtils.closeHandle(processHandle); ``` #### 线程操作方法 线程操作提供了获取线程信息、结束线程、暂停线程等功能。这些功能在调试工具、性能分析、线程管理等应用中使用。 ```java // 进程名取线程ID int[] threadIds = ProcessAndThreadUtils.processNameGetThreadTid("notepad.exe"); for (int tid : threadIds) { System.out.println("线程ID: " + tid); } // 线程ID取进程名 String threadProcessName = ProcessAndThreadUtils.threadTidGetProcessName(1234); System.out.println("线程所属进程: " + threadProcessName); // 线程ID取进程PID int threadPid = ProcessAndThreadUtils.threadTidGetProcessPid(1234); System.out.println("线程所属PID: " + threadPid); // 打开线程 int threadHandle = ProcessAndThreadUtils.openThread(1234); System.out.println("线程句柄: " + threadHandle); // 结束线程 ProcessAndThreadUtils.overThread(1234); System.out.println("线程已结束"); // 暂停线程 ProcessAndThreadUtils.threadSuspended(threadHandle); System.out.println("线程已暂停"); // 关闭线程句柄 ProcessAndThreadUtils.closeHandle(threadHandle); ``` #### 权限操作方法 权限提升是系统安全中的重要概念,JSCM 提供了多种系统权限的提升功能。管理员权限可以执行一些需要更高权限的操作,如访问系统目录、修改注册表等。 ```java // 提升权限(备份权限) boolean backupResult = ProcessAndThreadUtils.elevatePrivileges(3); // SE_BACKUP_PRIVILEGE System.out.println("备份权限提升: " + backupResult); // 提升权限(恢复权限) boolean restoreResult = ProcessAndThreadUtils.elevatePrivileges(4); // SE_RESTORE_PRIVILEGE System.out.println("恢复权限提升: " + restoreResult); // 提升权限(关机权限) boolean shutdownResult = ProcessAndThreadUtils.elevatePrivileges(5); // SE_SHUTDOWN_PRIVILEGE System.out.println("关机权限提升: " + shutdownResult); // 提升权限(调试权限) boolean debugResult = ProcessAndThreadUtils.elevatePrivileges(11); // SE_DEBUG_PRIVILEGE System.out.println("调试权限提升: " + debugResult); ``` #### 模块操作方法 模块枚举可以获取进程加载的所有动态链接库信息,对于分析进程、检查注入模块等场景非常有用。 ```java import com.scm.all.struct.TagModuleenTry32; import java.util.List; // 进程ID取进程模块(32位) List modulesX86 = ProcessAndThreadUtils.processPidToModuleX86(1234); for (TagModuleenTry32 module : modulesX86) { System.out.println("模块: " + module.szExePath + " 句柄: " + module.hModule); } // 进程ID取进程模块(64位JDK下的32位模块) List modulesx86 = ProcessAndThreadUtils.processPidToModulex86(1234); // 进程ID取进程模块(64位) List modulesX64 = ProcessAndThreadUtils.processPidToModuleX64(1234); ``` --- ### MemoryOperationUtilsX86/X64 内存操作工具类 内存操作是 JSCM 框架中最核心也是最复杂的功能模块,分为 X86(32位)和 X64(64位)两个版本。内存操作允许程序读写其他进程的内存数据,进行内存搜索、特征码扫描等高级功能。在游戏辅助、内存分析、软件调试等领域,这些功能极为重要。 > **警告**:内存操作涉及系统底层功能,错误的操作可能导致目标进程崩溃或系统不稳定。请确保您具有足够的权限(管理员权限),并谨慎操作。 #### 内存属性操作 内存属性操作允许查询和修改内存区域的保护属性,如只读、读写、执行等。这对于绕过某些内存保护机制或分析内存布局非常有用。 ```java import com.scm.all.x86.export.MemoryOperationUtilsX86; import com.scm.all.struct.TagPmemory_Basic_InfoRmationX86; // 打开目标进程 int processHandle = ProcessAndThreadUtils.openProcess(1234); // 查询内存属性 TagPmemory_Basic_InfoRmationX86 memInfo = MemoryOperationUtilsX86.selectMemoryAddressAttribute(processHandle, 0x00400000); System.out.println("内存基址: 0x" + Long.toHexString(memInfo.BaseAddress)); System.out.println("内存大小: " + memInfo.RegionSize); System.out.println("内存状态: " + memInfo.State); System.out.println("内存保护: " + memInfo.Protect); // 修改内存保护属性 boolean updateResult = MemoryOperationUtilsX86.updateMemoryAddressAttribute(processHandle, 0x00400000, 1024, com.scm.all.enumBox.RedrawWindow.PAGE_READWRITE); System.out.println("修改内存保护: " + updateResult); // 判断内存地址是否有效 boolean isValid = MemoryOperationUtilsX86.memoryAddressIsValid(processHandle, 0x00400000); System.out.println("内存地址有效: " + isValid); // 判断是否为静态地址 boolean isStatic = MemoryOperationUtilsX86.memoryAddressIsStatic(processHandle, 0x00400000); System.out.println("是否为静态地址: " + isStatic); // 判断是否为基址 boolean isBase = MemoryOperationUtilsX86.memoryAddressIsBaseAddress(processHandle, 0x00400000); System.out.println("是否为基址: " + isBase); ``` #### 内存读写操作 内存读写是内存操作的基础功能,支持读取和写入各种数据类型。JSCM 提供了基础读写和带偏移读写两种方式。 ```java // 内存读字节 byte[] readBytes = MemoryOperationUtilsX86.readProcessMemoryByte(processHandle, 0x00400000, 4); int intValue = ByteUtils.bytesArrayToInt(readBytes); System.out.println("读取整数: " + intValue); // 内存读字节(带偏移) int[] offsets = {0x100, 0x200, 0x10}; byte[] offsetBytes = MemoryOperationUtilsX86.readProcessMemoryByteOffSet(processHandle, 0x00401000, offsets, 4); int offsetValue = ByteUtils.bytesArrayToInt(offsetBytes); System.out.println("读取偏移值: " + offsetValue); // 内存写字节 byte[] writeData = ByteUtils.intToBytesArray(9999); boolean writeResult = MemoryOperationUtilsX86.writeProcessMemoryByte(processHandle, 0x00400000, 4, writeData); System.out.println("写入内存: " + writeResult); // 内存写字节(带偏移) boolean offsetWriteResult = MemoryOperationUtilsX86.writeProcessMemoryByteOffSet(processHandle, 0x00401000, offsets, 4, writeData); System.out.println("写入偏移内存: " + offsetWriteResult); // 读取字符串 String readString = MemoryOperationUtilsX86.readProcessMemoryString(processHandle, 0x00403000, 100); System.out.println("读取字符串: " + readString); // 写入字符串 boolean writeStrResult = MemoryOperationUtilsX86.writeProcessMemoryString(processHandle, 0x00403000, "Hello World"); ``` #### 内存搜索操作 内存搜索允许在目标进程内存中查找特定的数据模式,是特征码扫描的基础功能。 ```java import com.scm.all.pfunc.MemoryCallBack; // 创建内存搜索回调 MemoryCallBack searchCallback = new MemoryCallBack() { @Override public void memoryCallback(int processId, long memoryAddress, byte[] data, int dataSize) { System.out.println("找到地址: 0x" + Long.toHexString(memoryAddress)); } }; // 线程模式内存搜索(搜索整数) int searchValue = 1000; MemoryOperationUtilsX86.threadSearchMemory(processHandle, searchValue, searchCallback); // 线程模式特征码搜索 String signature = "55 8B EC ?? 83 EC ?? 53 56 57"; MemoryOperationUtilsX86.threadMd5SearchMemory(processHandle, signature, searchCallback); // 内存范围搜索 // 在指定地址范围内搜索数据 long startAddress = 0x00400000L; long endAddress = 0x01000000L; ``` #### 内存分配操作 内存分配允许在目标进程中分配和释放内存,常用于代码注入和远程线程创建等高级操作。 ```java // 申请内存 long allocatedAddr = MemoryOperationUtilsX86.virtualAllocEx(processHandle, 0, 4096, com.scm.all.enumBox.RedrawWindow.MEM_COMMIT | com.scm.all.enumBox.RedrawWindow.PAGE_READWRITE); System.out.println("分配内存地址: 0x" + Long.toHexString(allocatedAddr)); // 释放内存 boolean freeResult = MemoryOperationUtilsX86.virtualFreeEx(processHandle, allocatedAddr, 0, com.scm.all.enumBox.RedrawWindow.MEM_RELEASE); System.out.println("释放内存: " + freeResult); ``` #### X64 版本差异 X64 版本的内存操作与 X86 版本接口基本一致,主要差异在于地址类型从 int 变为 long,以适应 64 位地址空间。 ```java import com.scm.all.x64.export.MemoryOperationUtilsX64; // 打开64位进程 int processHandle64 = ProcessAndThreadUtils.openProcess(5678); // 读取64位进程内存 long address64 = 0x00007FF6A1234000L; byte[] readBytes64 = MemoryOperationUtilsX64.readProcessMemoryByte(processHandle64, address64, 8); long value64 = ByteUtils.bytesArrayToLong1(readBytes64); System.out.println("读取64位值: " + value64); // 写入64位进程内存 byte[] writeData64 = ByteUtils.longToBytesArray(1234567890123L); MemoryOperationUtilsX64.writeProcessMemoryByte(processHandle64, address64, 8, writeData64); ``` --- ### RegistryOperationUtilsX86/X64 注册表操作工具类 注册表是 Windows 系统的核心数据库,存储了系统和应用程序的配置信息。RegistryOperationUtils 提供了对 Windows 注册表的完整操作能力,分为 X86 和 X64 两个版本。 > **注意**:注册表操作需要管理员权限,且错误的修改可能导致系统不稳定。请谨慎操作,并在操作前备份相关键值。 #### 注册表键操作 ```java import com.scm.all.x86.export.RegistryOperationUtilsX86; import com.scm.all.struct.TagRegisTryGroupInfo; // 创建注册表键 boolean createResult = RegistryOperationUtilsX86.createRegKey( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp"); System.out.println("创建键: " + createResult); // 删除注册表键 boolean deleteResult = RegistryOperationUtilsX86.deleteRegKey( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp"); System.out.println("删除键: " + deleteResult); // 判断键是否存在 boolean exists = RegistryOperationUtilsX86.isRegKeyExists( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\Microsoft"); System.out.println("键存在: " + exists); // 枚举子键 String[] subKeys = RegistryOperationUtilsX86.enumRegKey( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software"); for (String key : subKeys) { System.out.println("子键: " + key); } ``` #### 注册表值操作 ```java // 设置字符串值 RegistryOperationUtilsX86.setRegValue( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp", "Username", "TestUser", com.scm.all.enumBox.AdapterDateType.REG_SZ); // 设置整数值的示例代码 RegistryOperationUtilsX86.setRegValue( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp", "Age", "25", com.scm.all.enumBox.AdapterDateType.REG_DWORD); // 获取字符串值 String username = RegistryOperationUtilsX86.getRegValue( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp", "Username"); System.out.println("用户名: " + username); // 获取整数值 int age = Integer.parseInt(RegistryOperationUtilsX86.getRegValue( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp", "Age")); System.out.println("年龄: " + age); // 删除值 RegistryOperationUtilsX86.deleteRegValue( com.scm.all.enumBox.ComboBoxState.HKEY_CURRENT_USER, "Software\\MyTestApp", "Username"); ``` --- ### 键鼠驱动模块 JSCM 框架集成了三种键鼠驱动:DD键鼠驱动、幽灵键鼠驱动和Md键鼠驱动。这些驱动提供了硬件级别的输入模拟能力,能够在游戏中实现更精准的自动化操作。 #### DD键鼠驱动 DD键鼠驱动是最常用的键鼠模拟驱动,提供了简单易用的鼠标和键盘模拟功能。 ```java import com.scm.all.export.hotkey.DdDriver; // 初始化DD键鼠驱动 DdDriver.init(); // 鼠标操作 // 鼠标移动到绝对坐标 DdDriver.mov(500, 500); // 鼠标相对移动 DdDriver.movR(100, 100); // 鼠标点击(1=左键按下, 2=左键放开) DdDriver.btn(1); DdDriver.btn(2); // 鼠标右键点击 DdDriver.btn(3); DdDriver.btn(4); // 鼠标滚轮(正数向前,负数向后) DdDriver.whl(3); // 键盘操作 // 按键按下 DdDriver.key(0x41, 1); // A键按下 // 按键放开 DdDriver.key(0x41, 2); // A键放开 // 直接输入字符串 DdDriver.str("Hello World 你好世界"); ``` #### 幽灵键鼠驱动 幽灵键鼠驱动提供了更丰富的硬件模拟功能,支持设备选择、按键延时设置等高级特性。 ```java import com.scm.all.export.hotkey.GhostDriver; // 初始化幽灵键鼠驱动 GhostDriver.init(); // 获取设备列表 String[] deviceList = GhostDriver.getDeviceListByModel("My Device"); System.out.println("可用设备: " + String.join(", ", deviceList)); // 选择设备 GhostDriver.selectDeviceBySerialNumber("SN123456789"); // 检查设备连接状态 boolean connected = GhostDriver.isDeviceConnected(); System.out.println("设备连接: " + connected); // 获取设备信息 String model = GhostDriver.getModel(); String serialNumber = GhostDriver.getSerialNumber(); String firmwareVersion = GhostDriver.getFirmwareVersion(); System.out.println("型号: " + model + ", SN: " + serialNumber + ", 固件: " + firmwareVersion); // 设置按键延时(毫秒) GhostDriver.setPressKeyDelay(50); // 键盘操作 // 按键按下(通过键名) GhostDriver.pressKeyByName("A"); // 按键释放 GhostDriver.releaseKeyByName("A"); // 按下并释放 GhostDriver.pressAndReleaseKeyByName("Enter"); // 检查按键是否按下 boolean isPressed = GhostDriver.isKeyPressedByName("Space"); System.out.println("空格键按下: " + isPressed); // 输入字符串 GhostDriver.inputString("Test String"); // 鼠标操作 // 鼠标移动到绝对坐标 GhostDriver.moveMouseTo(500, 500); // 鼠标相对移动 GhostDriver.moveMouseRelative(100, 100); // 鼠标按键按下 GhostDriver.pressMouseButton(1); // 1=左键, 2=右键, 3=中键 // 鼠标按键释放 GhostDriver.releaseMouseButton(1); // 鼠标滚轮 GhostDriver.moveMouseWheel(3); // 获取鼠标坐标 int mouseX = GhostDriver.getMouseX(); int mouseY = GhostDriver.getMouseY(); System.out.println("鼠标位置: (" + mouseX + ", " + mouseY + ")"); ``` #### 驱动安装 在使用键鼠驱动前,需要先安装驱动程序。JSCM 提供了自动安装功能。 ```java import com.scm.all.export.hotkey.install.InstallDDDriver; import com.scm.all.export.hotkey.install.InstallGhostDriver; import com.scm.all.export.hotkey.install.InstallMdDriver; // 安装DD驱动 boolean ddInstallResult = InstallDDDriver.install("C:\\drivers\\ddmouse64.sys"); System.out.println("DD驱动安装: " + ddInstallResult); // 安装幽灵驱动 boolean ghostInstallResult = InstallGhostDriver.install("C:\\drivers\\GhostMouse.sys"); System.out.println("幽灵驱动安装: " + ghostInstallResult); // 安装Md驱动 boolean mdInstallResult = InstallMdDriver.install("C:\\drivers\\mdmouse64.sys"); System.out.println("Md驱动安装: " + mdInstallResult); ``` --- ### 报表模块 JSCM 框架集成了锐浪报表(Grid++Report)功能,支持报表的设计、预览、打印和导出。通过该模块,开发者可以在 Java 应用中集成功能强大的报表功能。 ```java import com.scm.all.pfunc.CGridppReportEventHandler; // 报表初始化配置 // 设置路径 PathFileJSCM.setDebugFile32("C:\\path\\to\\x86\\"); PathFileJSCM.setDebugFile64("C:\\path\\to\\x64\\"); // 创建报表事件处理回调 CGridppReportEventHandler reportHandler = new CGridppReportEventHandler() { @Override public void onInitialize() { System.out.println("报表初始化"); } @Override public boolean onFetchRecord() { // 数据获取回调 return true; } @Override public void onPrintStart() { System.out.println("打印开始"); } @Override public void onPrintEnd() { System.out.println("打印结束"); } }; // 报表具体使用请参考锐浪报表官方文档 ``` --- ### 回调接口 JSCM 框架提供了多种回调接口,用于处理异步事件和系统通知。以下是主要回调接口的使用方法。 #### WindowEventCallBack 窗口事件回调 ```java import com.scm.all.pfunc.WindowEventCallBack; WindowEventCallBack windowCallback = new WindowEventCallBack() { @Override public void mouseEvent(int hwnd, int msg, int wParam, int lParam) { System.out.println("鼠标事件 - HWND: " + hwnd + ", 消息: " + msg + ", 参数: " + wParam); } @Override public void keyBoardEvent(int hwnd, int msg, int wParam, int lParam) { System.out.println("键盘事件 - HWND: " + hwnd + ", 消息: " + msg + ", 键码: " + wParam); } }; ``` #### MemoryCallBack 内存搜索回调 ```java import com.scm.all.pfunc.MemoryCallBack; MemoryCallBack memoryCallback = new MemoryCallBack() { @Override public void memoryCallback(int processId, long memoryAddress, byte[] data, int dataSize) { System.out.println("进程ID: " + processId); System.out.println("地址: 0x" + Long.toHexString(memoryAddress)); System.out.println("数据大小: " + dataSize); System.out.println("数据: " + ByteUtils.bytesToHexString(data)); } }; ``` #### KeyCodeCallBack 键盘回调 ```java import com.scm.all.pfunc.KeyCodeCallBack; KeyCodeCallBack keyCallback = new KeyCodeCallBack() { @Override public void keyEvent(int code, int wParam, int lParam) { if (code >= 0) { String keyText = SystemUtils.keyCodeToStringOne(wParam); System.out.println("按键: " + keyText + " (" + wParam + ")"); } } }; ``` #### ResponseEventCallBack 热键回调 ```java import com.scm.all.pfunc.ResponseEventCallBack; ResponseEventCallBack hotkeyCallback = new ResponseEventCallBack() { @Override public void responseEvent(int id, int param) { System.out.println("热键触发 - ID: " + id + ", 参数: " + param); } }; ``` --- ### 炫彩GUI界面框架 JSCM 框架集成了炫彩GUI(XCGUI)界面库,这是一套功能强大的轻量级 GUI 开发框架。炫彩GUI提供了丰富的 Windows 桌面应用程序 UI 组件,具有高性能、高度可定制、无第三方依赖等特点。通过 JSCM 框架,开发者可以使用 Java 语言直接调用炫彩GUI的所有功能,创建现代化界面的 Windows 应用程序。 炫彩GUI界面框架基于 C++ 开发,通过 JNI 技术桥接到 Java 层。框架支持创建各种常见的 Windows UI 组件,包括窗口、按钮、编辑框、列表、树形控件、菜单等。与传统的 Swing/AWT 相比,炫彩GUI具有更低的资源占用和更高的渲染效率,特别适合开发对性能和界面效果有较高要求的应用程序。 #### 炫彩GUI对象类型 炫彩GUI框架定义了丰富的对象类型,涵盖了从基础窗口到高级UI组件的完整体系。开发者可以通过 XcObjectType 枚举类了解所有可用的对象类型,并根据需求选择合适的组件进行开发。 | 类型值 | 对象类型 | 说明 | |-------|---------|------| | XC_WINDOW | 基础窗口 | 最基础的窗口对象 | | XC_MODALWINDOW | 模态窗口 | 阻塞父窗口交互的对话框 | | XC_FRAMEWND | 框架窗口 | 带标题栏和边框的窗口 | | XC_FLOATWND | 浮动窗口 | 可悬浮的窗口 | | XC_ELE | 基础元素 | 所有UI元素的基类 | | XC_BUTTON | 按钮 | 可点击的按钮组件 | | XC_EDIT | 编辑框 | 文本输入组件 | | XC_COMBOBOX | 下拉组合框 | 带下拉列表的组合框 | | XC_SCROLLBAR | 滚动条 | 滚动导航组件 | | XC_SCROLLVIEW | 滚动视图 | 支持滚动的内容视图 | | XC_LIST | 列表 | 列表显示组件 | | XC_LISTBOX | 列表框 | 列表框组件 | | XC_LISTVIEW | 列表视图 | 大图标模式列表 | | XC_TREE | 列表树 | 树形结构组件 | | XC_MENUBAR | 菜单条 | 菜单栏组件 | | XC_SLIDERBAR | 滑动条 | 滑动选择组件 | | XC_PROGRESSBAR | 进度条 | 进度显示组件 | | XC_TOOLBAR | 工具条 | 工具栏组件 | | XC_MONTHCAL | 月历卡片 | 日历选择组件 | | XC_DATETIME | 日期时间 | 日期时间选择组件 | | XC_PROPERTYGRID | 属性网格 | 属性编辑器组件 | | XC_TABBAR | TAB标签页 | 标签页切换组件 | | XC_PANE | 窗格 | 可停靠面板组件 | | XC_PANE_SPLIT | 窗格分割条 | 面板分隔组件 | | XC_SHAPE_TEXT | 文本形状 | 绘制文本图形 | | XC_SHAPE_PICTURE | 图片形状 | 绘制图片图形 | | XC_SHAPE_RECT | 矩形形状 | 绘制矩形图形 | | XC_SHAPE_ELLIPSE | 圆形形状 | 绘制椭圆图形 | | XC_SHAPE_LINE | 直线形状 | 绘制直线图形 | #### 炫彩GUI事件回调 炫彩GUI框架提供了完善的事件处理机制,通过 XEleEventCallBack 类可以捕获各种UI事件并进行相应处理。以下是常用的事件回调方法。 ```java import com.scm.all.pfunc.XEleEventCallBack; // 创建炫彩GUI事件回调 XEleEventCallBack xcguiCallback = new XEleEventCallBack() { // 按钮点击事件 @Override public boolean OnBtnClick(int hEle) { System.out.println("按钮被点击,句柄: " + hEle); return true; // 返回true表示已处理该事件 } // 按钮选中状态改变事件 @Override public boolean OnButtonCheck(int hEle, boolean bCheck) { System.out.println("按钮选中状态改变: " + bCheck); return true; } // 编辑框内容改变事件 @Override public boolean OnEditChanged(int hEle) { System.out.println("编辑框内容已改变"); return true; } // 组合框选中项改变事件 @Override public boolean OnComboBoxSelect(int hEle, int iItem) { System.out.println("选中项索引: " + iItem); return true; } // 元素销毁事件 @Override public boolean OnDestroy(int hEle) { System.out.println("元素销毁,句柄: " + hEle); return true; } // 鼠标移动事件 @Override public boolean OnMouseMove(int hEle, int flags, int pointX, int pointY) { System.out.println("鼠标移动到: (" + pointX + ", " + pointY + ")"); return true; } // 鼠标左键按下事件 @Override public boolean OnLButtonDown(int hEle, int flags, int pointX, int pointY) { System.out.println("鼠标左键按下: (" + pointX + ", " + pointY + ")"); return true; } // 鼠标左键抬起事件 @Override public boolean OnLButtonUp(int hEle, int flags, int pointX, int pointY) { System.out.println("鼠标左键抬起: (" + pointX + ", " + pointY + ")"); return true; } // 元素获取焦点事件 @Override public boolean OnSetFocus(int hEle) { System.out.println("元素获取焦点"); return true; } // 元素失去焦点事件 @Override public boolean OnKillFocus(int hEle) { System.out.println("元素失去焦点"); return true; } }; ``` #### 炫彩GUI组件使用示例 以下示例展示了如何使用炫彩GUI框架创建基本的窗口和按钮组件。 ```java import com.scm.all.export.ModuleOperationUtilsJNI; import com.scm.all.pfunc.XEleEventCallBack; // 初始化框架 ModuleOperationUtilsJNI.initOutFile(); // 创建基础窗口 int hWindow = ModuleOperationUtilsJNI.XC_ShellCreateWindow( "JSCM 炫彩GUI示例", // 窗口标题 0, 0, // x, y 坐标 800, 600, // 宽度, 高度 0 // 窗口样式 ); // 创建按钮 int hButton = ModuleOperationUtilsJNI.XC_ButtonCreate( hWindow, // 父窗口句柄 "点击我", // 按钮文本 100, 100, // x, y 坐标 100, 30 // 宽度, 高度 ); // 设置按钮文本 ModuleOperationUtilsJNI.XC_SetWindowText(hButton, "确认"); // 获取按钮文本 String buttonText = ModuleOperationUtilsJNI.XC_GetWindowText(hButton); System.out.println("按钮文本: " + buttonText); // 设置元素属性 ModuleOperationUtilsJNI.XC_SetEleId(hButton, 1001); // 设置ID // 注册事件回调 ModuleOperationUtilsJNI.XC_EleRegisterEvent(hButton, xcguiCallback); // 显示窗口 ModuleOperationUtilsJNI.XC_ShowWindow(hWindow); // 消息循环(需要持续运行以处理UI事件) // ModuleOperationUtilsJNI.XC_RunXCPopupMenu(); // 销毁窗口 ModuleOperationUtilsJNI.XC_DestroyWindow(hWindow); ``` #### 创建其他常用组件 炫彩GUI框架支持创建多种UI组件,以下是创建一些常用组件的示例。 ```java // 创建编辑框 int hEdit = ModuleOperationUtilsJNI.XC_EditCreate( hWindow, "请输入内容...", 100, 150, 200, 30 ); // 设置编辑框只读 ModuleOperationUtilsJNI.XC_SetEleState(hEdit, com.scm.all.enumBox.ElementStateFlag.XC_EDIT_STATE_READONLY, true); // 创建滚动视图 int hScrollView = ModuleOperationUtilsJNI.XC_ScrollViewCreate( hWindow, 100, 200, 300, 200 ); // 创建列表 int hList = ModuleOperationUtilsJNI.XC_ListCreate( hWindow, 450, 100, 300, 400 ); // 添加列表项 ModuleOperationUtilsJNI.XC_ListAddItem(hList, "列表项1"); ModuleOperationUtilsJNI.XC_ListAddItem(hList, "列表项2"); ModuleOperationUtilsJNI.XC_ListAddItem(hList, "列表项3"); // 创建树形控件 int hTree = ModuleOperationUtilsJNI.XC_TreeCreate( hWindow, 50, 50, 200, 300 ); // 添加树节点 int hNode1 = ModuleOperationUtilsJNI.XC_TreeAddItem(hTree, "根节点1"); int hNode2 = ModuleOperationUtilsJNI.XC_TreeAddItem(hTree, "根节点2"); ModuleOperationUtilsJNI.XC_TreeAddItem(hTree, "子节点1", hNode1); // 创建进度条 int hProgressBar = ModuleOperationUtilsJNI.XC_ProgressBarCreate( hWindow, 100, 450, 300, 20 ); // 设置进度值 (0-100) ModuleOperationUtilsJNI.XC_ProgressBarSetPos(hProgressBar, 50); // 创建滑动条 int hSlider = ModuleOperationUtilsJNI.XC_SliderBarCreate( hWindow, 100, 480, 300, 30 ); // 设置滑动条范围和值 ModuleOperationUtilsJNI.XC_SliderBarSetRange(hSlider, 0, 100); ModuleOperationUtilsJNI.XC_SliderBarSetPos(hSlider, 50); // 创建组合框 int hComboBox = ModuleOperationUtilsJNI.XC_ComboBoxCreate( hWindow, 100, 520, 200, 30 ); // 添加下拉项 ModuleOperationUtilsJNI.XC_ComboBoxAddItem(hComboBox, "选项1"); ModuleOperationUtilsJNI.XC_ComboBoxAddItem(hComboBox, "选项2"); ModuleOperationUtilsJNI.XC_ComboBoxAddItem(hComboBox, "选项3"); // 设置选中项 ModuleOperationUtilsJNI.XC_ComboBoxSetSelectItem(hComboBox, 0); ``` #### 炫彩GUI样式和状态 炫彩GUI提供了丰富的样式和状态管理功能,可以自定义组件的外观和行为。 ```java import com.scm.all.enumBox.*; // 设置窗口样式 ModuleOperationUtilsJNI.XC_SetWindowStyle(hWindow, WindowStyle.WS_CAPTION | WindowStyle.WS_SYSMENU | WindowStyle.WS_MINIMIZEBOX); // 设置窗口透明 ModuleOperationUtilsJNI.XC_SetWindowAlpha(hWindow, 255); // 0-255 // 设置窗口圆角 ModuleOperationUtilsJNI.XC_SetWindowRoundedCorners(hWindow, 10, 10); // 设置元素背景颜色 ModuleOperationUtilsJNI.XC_SetEleBkColor(hButton, 0xFF0000); // 红色 // 设置元素文本颜色 ModuleOperationUtilsJNI.XC_SetEleTextColor(hButton, 0xFFFFFF); // 白色 // 设置元素状态 // 启用/禁用元素 ModuleOperationUtilsJNI.XC_SetEleState(hButton, ElementStateFlag.XC_ELE_STATE_DISABLE, true); // 禁用按钮 // 设置按钮选中状态 ModuleOperationUtilsJNI.XC_SetButtonCheck(hButton, true); // 获取元素状态 boolean isChecked = ModuleOperationUtilsJNI.XC_GetButtonCheck(hButton); System.out.println("按钮选中状态: " + isChecked); // 设置元素位置和大小 ModuleOperationUtilsJNI.XC_SetEleRect(hButton, 100, 100, 120, 40); // 获取元素位置和大小 int[] rect = ModuleOperationUtilsJNI.XC_GetEleRect(hButton); System.out.println("元素位置: x=" + rect[0] + ", y=" + rect[1] + ", width=" + rect[2] + ", height=" + rect[3]); ``` #### 炫彩GUI布局管理 炫彩GUI支持灵活的布局管理,可以方便地实现响应式UI设计。 ```java // 创建布局框架 int hLayoutFrame = ModuleOperationUtilsJNI.XC_LayoutFrameCreate(hWindow); // 添加布局元素 int hLayoutEle = ModuleOperationUtilsJNI.XC_EleLayoutCreate(hWindow); // 设置布局对齐方式 ModuleOperationUtilsJNI.XC_SetLayoutEleAlign(hLayoutEle, LayoutAlign.XC_LAYOUT_ALIGN_LEFT, // 左对齐 LayoutAlign.XC_LAYOUT_ALIGN_TOP); // 顶对齐 // 设置布局间距 ModuleOperationUtilsJNI.XC_SetLayoutEleMargin(hLayoutEle, 10, 10, 10, 10); // 左上右下 // 设置元素布局权重 ModuleOperationUtilsJNI.XC_SetLayoutEleSize(hLayoutEle, 100, 50, LayoutSize.XC_LAYOUT_SIZE_TYPE_AUTO); // 自动大小 ``` #### 炫彩GUI绘图功能 炫彩GUI提供了强大的自绘功能,允许开发者自定义组件的绘制逻辑。 ```java // 创建形状文本 int hShapeText = ModuleOperationUtilsJNI.XC_ShapeTextCreate( hWindow, "显示的文本", 50, 50, 200, 30 ); // 设置形状文本属性 ModuleOperationUtilsJNI.XC_SetShapeTextColor(hShapeText, 0x000000); // 黑色 ModuleOperationUtilsJNI.XC_SetShapeTextFont(hShapeText, "宋体", 14); // 字体和大小 // 创建形状图片 int hShapePicture = ModuleOperationUtilsJNI.XC_ShapePictureCreate( hWindow, "C:\\image.png", // 图片路径 50, 100, 200, 150 ); // 创建形状矩形 int hShapeRect = ModuleOperationUtilsJNI.XC_ShapeRectCreate( hWindow, 50, 300, 200, 100 ); // 设置矩形边框颜色和宽度 ModuleOperationUtilsJNI.XC_SetShapeRectBorderColor(hShapeRect, 0xFF0000); ModuleOperationUtilsJNI.XC_SetShapeRectBorderWidth(hShapeRect, 2); // 设置矩形填充颜色 ModuleOperationUtilsJNI.XC_SetShapeRectFillColor(hShapeRect, 0x00FF00); // 创建形状圆形 int hShapeEllipse = ModuleOperationUtilsJNI.XC_ShapeEllipseCreate( hWindow, 300, 350, 100, 50 ); ``` #### 炫彩GUI菜单功能 炫彩GUI支持创建各种类型的菜单,包括菜单条、弹出菜单等。 ```java // 创建菜单条 int hMenuBar = ModuleOperationUtilsJNI.XC_MenuBarCreate(hWindow); // 添加菜单项 int hMenuFile = ModuleOperationUtilsJNI.XC_MenuBarAddMenu(hMenuBar, "文件"); int hMenuEdit = ModuleOperationUtilsJNI.XC_MenuBarAddMenu(hMenuBar, "编辑"); int hMenuHelp = ModuleOperationUtilsJNI.XC_MenuBarAddMenu(hMenuBar, "帮助"); // 添加子菜单项 ModuleOperationUtilsJNI.XC_MenuBarAddItem(hMenuFile, "新建", 1); ModuleOperationUtilsJNI.XC_MenuBarAddItem(hMenuFile, "打开", 2); ModuleOperationUtilsJNI.XC_MenuBarAddItem(hMenuFile, "-", 0); // 分隔线 ModuleOperationUtilsJNI.XC_MenuBarAddItem(hMenuFile, "退出", 3); // 创建弹出菜单 int hPopupMenu = ModuleOperationUtilsJNI.XC_PopupMenuCreate(hWindow); // 添加弹出菜单项 ModuleOperationUtilsJNI.XC_PopupMenuAddItem(hPopupMenu, "复制", 1); ModuleOperationUtilsJNI.XC_PopupMenuAddItem(hPopupMenu,2); // 显示弹出 "粘贴", 菜单(在位置) ModuleOperationUtilsJNI.XC_PopupMenu指定ShowMenu(hPopupMenu, hWindow, 100, 100); ``` --- ## 使用案例 以下是 JSCM 框架在实际应用中的典型使用案例,涵盖了自动化工具、游戏辅助、系统监控等常见场景。 ### 案例一:自动化测试工具 ```java public class AutomationDemo { public static void main(String[] args) throws Exception { // 初始化框架 PathFileJSCM.setDebugFile32("demo\\x86\\"); PathFileJSCM.setDebugFile64("demo\\x64\\"); // 启动记事本 Runtime.getRuntime().exec("notepad.exe"); Thread.sleep(1000); // 查找记事本窗口 int notepadHwnd = WindowOperationUtils.windowGetHwndTow(0, "Notepad", "无标题 - 记事本"); if (notepadHwnd == 0) { System.out.println("未找到记事本窗口"); return; } // 获取窗口位置 int[] rect = WindowOperationUtils.windowGetRectToSize(notepadHwnd); System.out.println("窗口位置: " + Arrays.toString(rect)); // 窗口置顶 WindowOperationUtils.windowTop(notepadHwnd, true); // 窗口激活 WindowOperationUtils.windowActivation(notepadHwnd); // 枚举子窗口(编辑框) int[] childHwnds = WindowOperationUtils.WindowEnum(notepadHwnd); for (int hwnd : childHwnds) { String className = WindowOperationUtils.windowGetClassName(hwnd); if ("Edit".equals(className)) { // 向编辑框发送文本 // 具体实现需要使用SendMessage等API System.out.println("找到编辑框,句柄: " + hwnd); break; } } System.out.println("自动化测试完成"); } } ``` ### 案例二:游戏辅助工具 ```java public class GameAssistDemo { public static void main(String[] args) throws Exception { // 初始化 PathFileJSCM.setDebugFile32("demo\\x86\\"); // 查找游戏进程 int pid = ProcessAndThreadUtils.processNameGetPid("game.exe"); if (pid == 0) { System.out.println("未找到游戏进程"); return; } System.out.println("找到游戏进程,PID: " + pid); // 打开进程 int handle = ProcessAndThreadUtils.openProcess(pid); if (handle == 0) { System.out.println("打开进程失败"); return; } // 提升调试权限 ProcessAndThreadUtils.elevatePrivileges(11); // SE_DEBUG_PRIVILEGE // 读取游戏基址 long baseAddress = 0x00400000L; // 读取血量(假设血量偏移为 0x1234) byte[] hpBytes = MemoryOperationUtilsX86.readProcessMemoryByte(handle, baseAddress + 0x1234, 4); int hp = ByteUtils.bytesArrayToInt(hpBytes); System.out.println("当前血量: " + hp); // 搜索角色坐标(需要先确定特征码) String coordSignature = "?? ?? ?? ?? 00 00 00 00"; // 关闭句柄 ProcessAndThreadUtils.closeHandle(handle); } } ``` ### 案例三:系统监控工具 ```java public class SystemMonitorDemo { public static void main(String[] args) { // 创建热键回调 ResponseEventCallBack hotkeyCallback = new ResponseEventCallBack() { @Override public void responseEvent(int id, int param) { System.out.println("捕获到热键: " + id); // 显示所有窗口 int[] hwnds = WindowOperationUtils.constraintGetHwnd(); System.out.println("当前窗口数量: " + hwnds.length); for (int hwnd : hwnds) { String title = WindowOperationUtils.windowGetTitle(hwnd); if (title != null && !title.isEmpty() && title.length() < 50) { System.out.println(" - " + title); } } } }; // 注册热键 Ctrl+Shift+M int monitorId = 100; SystemUtils.listeningHotKeyOne(0, monitorId, com.scm.all.enumBox.WindowFieldOffsets.MOD_CONTROL | com.scm.all.enumBox.WindowFieldOffsets.MOD_SHIFT, 0x4D, hotkeyCallback); // M键 System.out.println("系统监控已启动,按 Ctrl+Shift+M 查看窗口列表"); System.out.println("按任意键退出..."); try { System.in.read(); } catch (Exception e) { e.printStackTrace(); } // 卸载热键 SystemUtils.removeListeningHotKeyOne(monitorId); } } ``` --- ## 常见问题 ### 1. DLL 加载失败 **问题描述**:运行时出现 "Can't find dependent libraries" 错误。 **解决方案**:请将 JAR 包中对应的系统版本号的 jawt.dll 文件放在 java.exe 的运行目录下,或者从 Java 目录下直接复制到对应位置即可。因为界面库依赖了 Swing 库,需要确保 jawt.dll 正确加载。 ### 2. 内存操作权限不足 **问题描述**:内存读写返回 false 或抛出访问异常。 **解决方案**:请以管理员权限运行应用程序。部分内存操作需要 SeDebugPrivilege 权限,可以使用 ProcessAndThreadUtils.elevatePrivileges(11) 提升权限。 ### 3. 键鼠驱动无法使用 **问题描述**:DD 驱动或幽灵驱动初始化失败。 **解决方案**:请确保驱动程序已正确安装。可以使用 InstallDDDriver 或 InstallGhostDriver 类的方法安装驱动。部分驱动需要禁用驱动签名强制才能正常加载。 ### 4. 32位与64位选择 **问题描述**:不确定应该使用 X86 还是 X64 版本的类。 **解决方案**:选择取决于目标进程的架构,而非 JDK 的架构。如果目标进程是 32 位程序,即使使用 64 位 JDK,也需要使用 X86 版本的类。如果目标进程是 64 位程序,则使用 X64 版本。 ### 5. 中文乱码问题 **问题描述**:读取或写入的中文字符出现乱码。 **解决方案**:确保使用正确的编码方法。WindowOperationUtils 中的窗口标题获取方法默认使用 Unicode 编码。ByteUtils 提供了 bytesArrayToUtf8WideString 方法用于处理包含中文的 UTF-8 字符串。 --- ## 技术支持 ### 联系方式 - **官网地址**:https://www.snailcatmall.com - **官方QQ群**:128828632 - **技术支持邮箱**:1012518027@qq.com - **视频学习文档合集**:https://space.bilibili.com/29826047/lists?sid=7051754 - **炫彩界面库官方API文档**:http://8.138.59.98/xcgui/index.html ### 版本信息 - **框架版本**:V1.2.8 - **更新日期**:2026年2月 --- ## 附录 ### 结构体一览 JSCM 框架提供了丰富的结构体定义,用于封装 Windows API 的数据结构。主要结构体包括: | 结构体名称 | 说明 | |-----------|------| | TagRect | 矩形结构(left, top, right, bottom) | | TagPoint | 点坐标结构(x, y) | | TagProcessenTry32 | 进程信息结构 | | TagThreadEntry32 | 线程信息结构 | | TagModuleenTry32 | 模块信息结构 | | TagPmemory_Basic_InfoRmationX86/X64 | 内存信息结构 | | TagINPUT | 输入事件结构 | | TagHotKeyInfoTow | 热键信息结构 | ### 枚举类一览 框架提供了大量的枚举类,用于定义常量和选项。主要枚举类包括: | 枚举类名称 | 说明 | |-----------|------| | WindowStyle | 窗口样式枚举 | | MessageBoxFlag | 消息框标志 | | WindowStateFlag | 窗口状态标志 | | ButtonStateFlag | 按钮状态标志 | | RedrawWindow | 内存保护标志 | | ComboBoxState | 注册表根键 | --- *文档最后更新时间:2026年3月*