UNPKG

medical

Version:
175 lines (158 loc) 5.96 kB
const ffi = require('ffi-napi') const path = require('path') const fs = require('fs'); const hisLogger = require("../../../src/hisLogger"); const { K, U } = require('win32-api') const ref = require('ref-napi') const iconv = require('iconv-lite') const knl32 = K.load() const userApi32 = U.load() // 初始化 lib/{dll}/api 文件中定义的所有函数 /** * https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c?redirectedfrom=MSDN * @param en_zh 字符串 en 英文状态 zh中文状态 * @returns {Promise<void>} */ async function setImm32(en_zh){ // const imm32 = ffi.Library("imm32.dll", { // ImmSimulateHotKey: ["bool", ["long",'long']], // ImmGetContext: ["long", ["long"]], // ImmGetDefaultIMEWnd: ["long", ["long"]], // ImmGetOpenStatus: ["bool", ['long']], // ImmGetConversionStatus:["bool", ["long","int","int"]], // ImmSetConversionStatus:["bool", ["long","int","int"]] // }); // const user32 = ffi.Library("user32.dll", { // 'GetKeyboardLayout': ["long", ["long"]], // 'GetActiveWindow': ["long", ["long"]], // 'LoadKeyboardLayout': ["long", ["long"]], // 'ActivateKeyboardLayout': ["long", ["long"]] // }); // const imeToggle=112; // let current = user32.GetKeyboardLayout(0); // hisLogger.hisLogger({LoadKeyboardLayout:current}) // if (en_zh=="en"){ // current = user32.GetKeyboardLayout(0); // }else { // current = user32.LoadKeyboardLayout("0x0409", KLF_ACTIVATE) // hisLogger.hisLogger({LoadKeyboardLayout:current}) // } // user32.keybd_event(0x11,0,0,0); user32.keybd_event(0x10,0,0,0); user32.keybd_event(0x10,0,2,0); // user32.keybd_event(0x11,0,2,0); console.log("设置中英文切换成功!") // let curr_window = userApi32.GetForegroundWindow() // let thread_id = userApi32.GetWindowThreadProcessId(curr_window, null) // let klid = user32.GetKeyboardLayout(thread_id) // console.log(klid.toString(16)) // //8040804 // let lid_hex = "0x"+klid.toString(16) // // console.log(lid_hex) // if(lid_hex.indexOf("0x409")>0){ // console.log('当前的输入法状态是英文输入模式\n\n') // } else if (lid_hex.indexOf('0x804')>0){ // console.log('当前的输入法是中文输入模式\n\n') // } else { // console.log('当前的输入法既不是英文输入也不是中文输入\n\n') // } // // let prt = imm32.ImmGetDefaultIMEWnd(curr_window); // let curIMode = 0; // let curISentence = 0; // if(!imm32.ImmGetConversionStatus(prt,curIMode,curISentence)){ // console.log('当前的输入法既不是英文输入也不是中文输入\n\n',curIMode,curISentence) // } // let conversion=1025; // let sentence=0; // if (!imm32.ImmSetConversionStatus(prt, conversion, sentence)) // { // console.log('change error') // console.log('当前的输入法: ',conversion, sentence) // } // console.log('当前的输入法: ',conversion, sentence) } const voidPtr = ref.refType(ref.types.void); const stringPtr = ref.refType(ref.types.CString); const user32 = ffi.Library('user32.dll', { GetSystemMenu: ['int', ['int', 'bool']], EnumWindows: ['bool', [voidPtr, 'int32']], GetWindowTextA: ['long', ['long', stringPtr, 'long']], SetForegroundWindow: ['bool', ['long']], MapVirtualKeyA: ['long', ['long', 'long']], PostMessageW: ['bool', ['long', 'long', 'long', ref.types.ulong]], SendMessageA: ['bool', ['long', 'long', 'long', ref.types.ulong]], keybd_event:['bool', ['int', 'int', 'int', 'int']], GetKeyboardLayout: ["long", ["long"]] }); //设置Path环境环境 async function setDllDirectory(dllDirectory){ const kernel32 = ffi.Library("kernel32", { 'SetDllDirectoryA': ["bool", ["string"]] }); kernel32.SetDllDirectoryA(dllDirectory) } async function invoke(dllDirectory,fileName,functionSymbol) { try { await setDllDirectory(dllDirectory); let fullPath = path.join(dllDirectory,fileName) hisLogger.hisLogger("信息:",fullPath,fileName,functionSymbol) let inits = ffi.Library(fullPath, functionSymbol); return inits; } catch(error) { hisLogger.hisLogger(error.toString()) } } /** * 读取路径信息 * @param {string} path 路径 */ function getStat(path){ return new Promise((resolve, reject) => { fs.stat(path, (err, stats) => { if(err){ resolve(false); }else{ resolve(stats); } }) }) } /** * 创建路径 * @param {string} dir 路径 */ function mkdir(dir){ return new Promise((resolve, reject) => { fs.mkdir(dir, err => { if(err){ resolve(false); }else{ resolve(true); } }) }) } /** * 路径是否存在,不存在则创建 * @param {string} dir 路径 */ async function dirExists(dir){ let isExists = await getStat(dir); //如果该路径且不是文件,返回true if(isExists && isExists.isDirectory()){ return true; }else if(isExists){ //如果该路径存在但是文件,返回false return false; } //如果该路径不存在 let tempDir = path.parse(dir).dir; //拿到上级路径 //递归判断,如果上级目录也不存在,则会代码会在此处继续循环执行,直到目录存在 let status = await dirExists(tempDir); let mkdirStatus; if(status){ mkdirStatus = await mkdir(dir); } return mkdirStatus; } module.exports={invoke,dirExists,setImm32}