【问题标题】:How to simulate typing/keypresses in C++ on Mac OS?如何在 Mac OS 上模拟 C++ 中的键入/按键?
【发布时间】:2016-11-11 10:46:27
【问题描述】:

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

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

这是我基于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% 认为这个解决方案的正确性),但我似乎无法输出像“ÁÉÍÓÜÖ”。

我该怎么做?一开始有可能吗?

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

非常感谢您,感谢您的帮助。

【问题讨论】:

  • 您如何使用CG 函数编译代码?

标签: c++ macos keypress


【解决方案1】:

它可以得到你想要的任何字符。您几乎走在正确的道路上。 我认为你只需要指定你感兴趣的 unicode 字符。 因此,如果您发送 unicode 并使用 kVK_Space 作为密钥代码,而不是发送密钥,您应该拥有您需要的东西,并且在发布事件之前,您可以调用以下代码一个事件对象

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

【讨论】:

  • 虽然我对这个答案给予了赏金,但它目前的形式并没有真正的帮助。这里的unicode是什么?我尝试使用const char* unicode = "Á";,但没有成功。
  • unicode 变量将是您想要打印的任何字符的整数(uint16_t)表示,在您的情况下为“Á”。
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2011-08-02
  • 2018-03-08
  • 2012-08-13
  • 2021-03-07
相关资源
最近更新 更多