一、使用 `osk.exe` 调用系统软键盘
通过进程启动 使用 `System.Diagnostics.Process` 类启动 `osk.exe` 来打开系统软键盘。需检查进程是否已运行,避免重复启动或崩溃。
```csharp
using System.Diagnostics;
Process kbpr = new Process();
kbpr.StartInfo.FileName = "osk.exe";
kbpr.StartInfo.UseShellExecute = false;
kbpr.StartInfo.RedirectStandardInput = true;
kbpr.StartInfo.RedirectStandardOutput = true;
kbpr.StartInfo.CreateNoWindow = true;
kbpr.Start();
// 发送按键
kbpr.StandardInput.WriteLine("a"); // 输入字符 'a'
kbpr.StandardInput.Flush();
// 关闭软键盘
if (!kbpr.HasExited)
{
kbpr.Kill();
}
```
注意事项
- 该方法仅适用于Windows系统,且需管理员权限运行。
- 需处理异常情况,如进程不存在或已被关闭。
二、使用 Windows API 函数 `SendInput`
通过调用 `SendInput` 可模拟按键输入,适用于需要精确控制输入的场景。
```csharp
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
static extern bool SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public uint type;
public MOUSEINPUT mi;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public INPUT[] iiInputs;
public uint cbSize;
}
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public uint mouseData;
public int dx;
public int dy;
public uint mouseState;
public uint dwFlags;
public IntPtr time;
public IntPtr dwExtraInfo;
}
static void Main()
{
// 模拟按下 'a' 键
INPUT[] inputs = new INPUT
{
new INPUT
{
type = 1, // INPUT_KEYBOARD
iiInputs = new INPUT
{
new INPUT
{
mouseData = 0,
dx = 0,
dy = 0,
mouseState = 0,
dwFlags = 0,
time = 0,
dwExtraInfo = 0
}
},
cbSize = Marshal.SizeOf(typeof(INPUT))
}
};
SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
// 模拟释放 'a' 键
inputs.iiInputs.mouseState = 0x0002; // KEYEVENTF_KEYUP
SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
}
}
```
优点: 跨平台(Windows、Linux、macOS),无需额外权限。 三、使用第三方库WinCC自带软键盘
在工业控制领域,WinCC 提供了 `TouchInputPC.exe` 可执行程序,支持通过参数控制是否显示数字小键盘或全键盘。
```bash
C:\Program Files (x86)\Common Files\Siemens\PTTouchInput 64位系统\TouchInputPC.exe -NoInfo -NumPadOn
```
适用于需要与WinCC系统集成的场景。
其他库
- AutoHotkey: 脚本语言,可模拟按键输入,适合自动化测试。 - Rust的`robotgo`库
四、注意事项
权限问题:调用系统级工具(如 `osk.exe`)通常需管理员权限。
兼容性:`osk.exe` 在Windows 10及以上版本中表现稳定,但其他方法需根据目标系统调整。
安全性:通过 `SendInput` 模拟输入需谨慎使用,避免被系统拦截或安全软件误判。
根据具体需求选择合适的方法,若需跨平台且控制精细,推荐使用 `SendInput` 或第三方库;若需简单调用且局限于Windows,`osk.exe` 是便捷的选择。