我使用firemonkey编写了屏幕键盘。
我用这段代码模拟关键事件:
void kbdEvent(unsigned int key, int modifiers)
{
::CGEventSourceRef source =
CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
::CGEventRef keyDown = CGEventCreateKeyboardEvent(source,
(::CGKeyCode)key, true);
::CGEventRef keyUp = CGEventCreateKeyboardEvent(source, (::CGKeyCode)key,
false);
CGEventSetFlags(keyDown, modifiers);
CGEventPost(kCGHIDEventTap, keyDown);
CGEventPost(kCGHIDEventTap, keyUp);
CFRelease(keyUp);
CFRelease(keyDown);
CFRelease(source);
}
问题在于,当我按下一个键时,我的表单会获得焦点,并且目标应用程序不会收到生成的事件。如果我将以下代码放入计时器中没有问题,并且“a”将在任何可编辑目标中输入:
kbdEvent(kVK_ANSI_A, 0);
如果没有得到关注,我怎么能这样做?
答案 0 :(得分:1)
OSK 需要的是 No Activate Form 。查看最受欢迎的firemonkey question 当用户单击它时,“No Activate”窗口不会成为前台窗口。当用户最小化或关闭前景窗口时,系统不会将此窗口置于前台。