如何在Electron应用中调用Windows 10屏幕键盘?
如何在Electron应用中调用Windows 10屏幕键盘?
嘿,我之前用Electron开发Windows 10桌面应用时刚好踩过这个坑,给你分享几个实用的方法,帮你调出系统自带的标准屏幕键盘,摆脱那个丑丑的触摸键盘~
核心思路
因为Electron集成了Node.js环境,所以我们可以直接用Node.js的child_process模块,调用Windows系统自带的屏幕键盘程序,完全不需要额外依赖。
方法一:调用标准屏幕键盘(osk.exe)
这个就是Windows 10自带的传统屏幕键盘,界面是规整的实体键盘布局,不是触摸优化的扁平样式,应该就是你想要的那种。
直接在代码里写个函数调用就行:
// 引入Node.js的child_process模块 const { exec } = require('child_process'); const os = require('os'); function openStandardOnScreenKeyboard() { // 先判断是不是Windows系统,避免非Windows环境出错 if (os.platform() !== 'win32') { console.error('这个功能只支持Windows系统哦'); return; } // 调用系统的osk.exe程序 exec('start osk.exe', (error, stdout, stderr) => { if (error) { console.error(`打开键盘失败:${error.message}`); return; } if (stderr) { console.error(`错误输出:${stderr}`); return; } console.log('标准屏幕键盘已打开'); }); }
需要打开键盘的时候,直接调用openStandardOnScreenKeyboard()就行,比如点击按钮、输入框获焦的时候触发。
方法二:调用触摸优化键盘(TabTip.exe)
如果你之后又想试试触摸友好的版本(就是平板模式下的那种),可以调用TabTip.exe,不过你说它丑,所以这个可能不是你的菜,但还是给你参考下:
const { exec } = require('child_process'); const os = require('os'); function openTouchKeyboard() { if (os.platform() !== 'win32') { console.error('仅支持Windows系统'); return; } exec('start TabTip.exe', (error) => { if (error) { console.error(`打开失败:${error.message}`); } }); }
进阶:输入框获焦自动唤起键盘
很多场景下我们需要用户点击输入框时自动弹出键盘,这时候可以结合Electron的主进程和渲染进程通信来实现:
1. 主进程代码(比如main.js)
const { app, BrowserWindow, ipcMain } = require('electron'); const { exec } = require('child_process'); const path = require('path'); function createWindow() { const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { // 用preload脚本更安全,符合Electron新规范 preload: path.join(__dirname, 'preload.js'), contextIsolation: true, nodeIntegration: false } }); mainWindow.loadFile('index.html'); } // 监听渲染进程的"打开键盘"请求 ipcMain.on('request-open-osk', () => { exec('start osk.exe', (error) => { if (error) { console.error(`打开失败:${error.message}`); } }); }); app.whenReady().then(() => { createWindow(); });
2. Preload脚本(preload.js)
用来在渲染进程和主进程之间安全通信:
const { contextBridge, ipcRenderer } = require('electron'); // 给渲染进程暴露安全的API contextBridge.exposeInMainWorld('electronKeyboard', { open: () => ipcRenderer.send('request-open-osk') });
3. 渲染进程(index.html)
在输入框获焦时调用暴露的API:
<input type="text" id="username-input" placeholder="点击输入用户名"> <script> const input = document.getElementById('username-input'); input.addEventListener('focus', () => { // 调用主进程的打开键盘方法 window.electronKeyboard.open(); }); </script>
额外小技巧:关闭屏幕键盘
如果需要程序化关闭键盘,可以用taskkill命令:
function closeOnScreenKeyboard() { if (os.platform() !== 'win32') return; exec('taskkill /im osk.exe /f', (error) => { if (error) { console.error(`关闭失败:${error.message}`); } else { console.log('屏幕键盘已关闭'); } }); }
注意事项
- 权限问题:如果你的应用需要管理员权限才能正常运行,打包的时候记得配置(比如用electron-builder的话,在
package.json的build.nsis里加"requestExecutionLevel": "highestAvailable"),不然可能会出现调用失败的情况。 - 版本兼容:这些方法在Windows 10 1909及以上版本亲测有效,旧版本的Windows可能路径或程序名有变化,建议在目标系统上测试。
如果还有其他问题,随时问我哦~




