创建屏幕键盘 [英] Create an On-screen Keyboard

查看:25
本文介绍了创建屏幕键盘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 PostMessage 在后台程序中模拟击键.除了需要在物理键盘上移动的字符外,它工作正常.我如何模拟移位?"

I use PostMessage to simulate keystrokes in a program that is in the background. It work fine except for characters that need shift on the physical keyboard. How do I simulate shift? "

我使用的代码大致是:

 VK vk = VkKeyScanEx (c, GetKeyboardLayout (0));

 AttachThreadInput (_attachedThredId, _attachedProcessId, true);
 PostMessage       (_window, WM_KEYDOWN, vk.key, 0x1);
 PostMessage       (_window, WM_KEYUP,   vk.key, 0xC0010001);
 AttachThreadInput (_attachedThredId, _attachedProcessId, false);

我应该如何处理 VK 的扩展部分?

How should I handle Extended part of VK?

编辑

我正在尝试创建一个屏幕键盘.屏幕键盘上的每个按钮模拟一系列击键.接收器是一个旧程序,它根据执行的键盘顺序执行不同的任务.键盘顺序如下

I'm trying to create an on-screen keyboard. Each button on the on-screen keyboard simulates a sequence of keystrokes. The receiver is an old program that performs different tasks depending on the keyboard sequence that is performed. Keyboard sequences is as follows

  • {ESC}NN{ESC}NN
  • {ESC}NN
  • ½NN
  • §NN

其中 {ESC} 模拟按 Esc 键,NN 是十六进制值,§/½ 让程序收听.

where {ESC} simulate pressing the Esc key, NN are hex values and §/½ get the program to listen.

通常我们有特殊的物理键盘来控制程序,但它们很昂贵.所以在我们并不总是有物理键盘的测试环境中,我们必须手动输入这些代码

Normally we have special physical keyboard to control the program, but they are expensive. So in a test environment where we do not always have the physical keyboards, we have to enter these codes manually

推荐答案

你必须妥协:

如果你想模拟键盘输入,那么你必须使用SendInput,这意味着取决于当前有焦点的窗口.SendInput 就像按下物理键盘上的键一样.使用键盘将击键发送到特定窗口的唯一方法是 ALT+TAB 到右侧窗口.

If you want to simulate keyboard input, then you must use SendInput, which means being at the mercy of which window currently has focus. SendInput is like hitting the keys on your physical keyboard. The only way you can send your keystrokes to a specific window using your keyboard is to ALT+TAB to the right window.

如果您想将击键发送到特定窗口,那么您会招致一些奇怪的行为:

If you want to send keystrokes to a specific window, then you incur funky behavior:

  1. 应用程序以不同方式处理输入.简单的WM_KEYDOWN/WM_KEYUP 消息并不是检测键盘输入的唯一方法.例如,还有键盘状态 (GetKeyboardState()),您将很难模拟它.这很可能是您遇到的情况.
  2. 应用程序可能依赖于在接收键盘输入消息时获得焦点的标准行为.通过向这些应用程序发布消息,您会调用可能使它们崩溃的奇怪的无序行为.
  3. 现在系统上的多个窗口可以同时接收键盘输入.这也可能导致奇怪的行为.
  4. (etc...) 不会为这个输入调用钩子,你的键盘/输入驱动程序不会看到它,它不会被 DirectInput 之类的东西识别......基本上它是一个永无止境的拼凑通过做坏事来解决问题.
  1. Applications handle input differently. And simple WM_KEYDOWN / WM_KEYUP messages are not the only way to detect keyboard input. For example there is also the keyboard state (GetKeyboardState()) which you will have a harder time simulating. This is most likely what you're experiencing.
  2. Applications may RELY on the standard behavior of having focus while receiving keyboard input messages. By posting messages to these applications, you invoke strange out-of-order behavior that may crash them.
  3. Now multiple windows on the system can be receiving keyboard input at the same time. This might also cause strange behavior.
  4. (etc...) Hooks won't be called for this input, your keyboard / input drivers won't see it, it won't be recognized by things like DirectInput... basically it's a never-ending patchwork of issues by doing something the bad-bear way.

没有办法避免这些副作用;这是做黑事的后果.

There is no way around those side-effects; it's the consequence of doing shady stuff.

针对您的目的的解决方案,因为您的目标是单个特定应用程序,可能是将 PostMessageSetKeyboardState 模拟键盘状态,包括移位位置.

A solution for your purposes, because you're targeting a single specific application, may be to use PostMessage in conjunction with SetKeyboardState to simulate the keyboard state including shift positions.

这篇关于创建屏幕键盘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆