如何在Mac OS上模拟C ++中的键入/按键?

时间:2016-11-11 10:46:28

标签: c++ macos keypress

我正在尝试编写类似于Mac ID的应用程序,但有一些不同的选项。

据我所知,所有类似的应用程序都将密码存储在Keychain中,只需在登录界面的密码字段中输入即可。

以下是基于Apple docsRobot编写的原始代码:

#include <ApplicationServices/ApplicationServices.h>

void Press(int key);
void Release(int key);
void Click(int key);

int main() {
    Press(56);
    Click(6);
    Release(56);
}

void Press(int key) {
    // Create an HID hardware event source
    CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

    // Create a new keyboard key press event
    CGEventRef evt = CGEventCreateKeyboardEvent(src, (CGKeyCode) key, true);

    // Post keyboard event and release
    CGEventPost (kCGHIDEventTap, evt);
    CFRelease (evt); CFRelease (src);

    usleep(60);
}

void Release(int key) {
    // Create an HID hardware event source
    CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

    // Create a new keyboard key release event
    CGEventRef evt = CGEventCreateKeyboardEvent(src, (CGKeyCode) key, false);

    // Post keyboard event and release
    CGEventPost (kCGHIDEventTap, evt);
    CFRelease (evt); CFRelease (src);

    usleep(60);
}

void Click(int key) {
    Press(key);
    Release(key);
}

它应该输出'Z',但输出'z'。根据文档修饰符,键也必须“按下”。

它出了什么问题?

然后在谷歌上搜索了一天之后,我发现this SO答案似乎解决了我的SHIFT问题(虽然我不是100%关于此解决方案的正确性),但我似乎无法输出像“ÁÉÍÓÜÖ”这样的人物。

我该怎么做?首先有可能吗?

我知道这已经不止一个问题了,但我仍然在尝试解决同样的问题,到目前为止我找不到完美的解决方案,所以我想其他人有这个答案会很好。< / p>

非常感谢您,感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

可以获得你想要的任何角色。你几乎走在正确的道路上。 我想你只需要指定你感兴趣的unicode角色。 因此,如果您发送unicode并使用kVK_Space作为键码而不是发送密钥,您应该拥有所需的内容,在发布事件之前,您可以调用以下代码,即事件对象

if (unicode){
unichar str[2] = {0};
str[0] = (unichar)unicode;
memcpy(str, &unicode, 4);
CGEventKeyboardSetUnicodeString(theEvent, 1, str);
}