medical
Version:
175 lines (158 loc) • 5.96 kB
JavaScript
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}