如何在Mac OS上用c++模拟打字/按键

How to simulate typing/keypresses in C++ on Mac OS?

本文关键字:模拟 按键 c++ 上用 Mac OS      更新时间:2023-10-16

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

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

这是我基于Apple docs和Robot编写的原始代码:

#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'。根据文档修改器,键也必须"按下"。

怎么了?

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

我该怎么做呢?这有可能吗?

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

事先非常感谢,任何帮助都是感激的。

你可以得到任何你想要的字符。你几乎走上了正确的道路。我认为你只需要指定你感兴趣的unicode字符。而不是发送key如果你发送unicode并使用kVK_Space作为键码你应该有你需要的在发布事件之前你可以调用下面的代码1事件对象

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