You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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.jsonbuild.nsis里加"requestExecutionLevel": "highestAvailable"),不然可能会出现调用失败的情况。
  • 版本兼容:这些方法在Windows 10 1909及以上版本亲测有效,旧版本的Windows可能路径或程序名有变化,建议在目标系统上测试。

如果还有其他问题,随时问我哦~

火山引擎 最新活动