如何在 Mac OS 上用 C++ 模拟 typing/keypresses?
How to simulate typing/keypresses in C++ on Mac OS?
我正在尝试编写一个类似于 Mac ID 的应用程序,但有一些不同的选项。
据我所知,所有类似的应用程序都将密码存储在钥匙串中,只需在登录屏幕的密码字段中输入即可。
这里是我原来的代码是基于Apple docs and 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'。根据文档修饰键也必须是 "pressed"。
怎么了?
然后在谷歌搜索一天后,我发现 this SO 答案似乎解决了我的 SHIFT 问题(虽然我不是 100% 相信这个解决方案的正确性),但我似乎无法输出像“ÁÉÍÓÜÖ”这样的字符。
我该怎么做?首先有可能吗?
我知道这已经不止一个问题了,但我仍在尝试解决同样的问题,到目前为止我找不到完美的解决方案,所以我想其他人也能得到这个答案会很好.
在此先感谢您,感谢您的帮助。
你想要的任何角色都有可能获得。你几乎走在正确的道路上。
我认为您只需要指定您感兴趣的 unicode 字符。
因此,如果您发送 unicode 并使用 kVK_Space 作为密钥代码,而不是发送密钥,您应该拥有您需要的东西,并且在发布事件之前,您可以调用以下代码一个事件对象
if (unicode){
unichar str[2] = {0};
str[0] = (unichar)unicode;
memcpy(str, &unicode, 4);
CGEventKeyboardSetUnicodeString(theEvent, 1, str);
}
我正在尝试编写一个类似于 Mac ID 的应用程序,但有一些不同的选项。
据我所知,所有类似的应用程序都将密码存储在钥匙串中,只需在登录屏幕的密码字段中输入即可。
这里是我原来的代码是基于Apple docs and 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'。根据文档修饰键也必须是 "pressed"。
怎么了?
然后在谷歌搜索一天后,我发现 this SO 答案似乎解决了我的 SHIFT 问题(虽然我不是 100% 相信这个解决方案的正确性),但我似乎无法输出像“ÁÉÍÓÜÖ”这样的字符。
我该怎么做?首先有可能吗?
我知道这已经不止一个问题了,但我仍在尝试解决同样的问题,到目前为止我找不到完美的解决方案,所以我想其他人也能得到这个答案会很好.
在此先感谢您,感谢您的帮助。
你想要的任何角色都有可能获得。你几乎走在正确的道路上。 我认为您只需要指定您感兴趣的 unicode 字符。 因此,如果您发送 unicode 并使用 kVK_Space 作为密钥代码,而不是发送密钥,您应该拥有您需要的东西,并且在发布事件之前,您可以调用以下代码一个事件对象
if (unicode){
unichar str[2] = {0};
str[0] = (unichar)unicode;
memcpy(str, &unicode, 4);
CGEventKeyboardSetUnicodeString(theEvent, 1, str);
}