Luk*_*uke 2 macos cocoa objective-c
我想在后台应用程序中全局隐藏鼠标指针或防止其移动。
我已经尝试过“ CGDisplayHideCursor(kCGDirectMainDisplay);”,但这似乎仅适用于前台应用程序。
这个答案似乎是我最好的选择,但是我无法编译它。具体来说,我得到:
体系结构i386的未定义符号:“ _ CGSDefaultConnection()”,引用自:main.o中的_main“ CGSSetConnectionProperty(int,int,__CFString const *,__CFBoolean const *)”,引用自:main.o中的_main
就隐藏指针而言,使用Event Taps的这段代码是我到目前为止发现的最接近的代码:
#include <ApplicationServices/ApplicationServices.h>
CGEventRef mouseEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
if (type != kCGEventMouseMoved)
return event;
return NULL;
}
int main(void)
{
CFMachPortRef mouseEventTap;
CFRunLoopSourceRef mouseRunloop;
mouseEventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0, (1 << kCGEventMouseMoved), mouseEventCallback, NULL);
if(!mouseEventTap)
exit(1);
mouseRunloop = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mouseEventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), mouseRunloop, kCFRunLoopCommonModes);
CGEventTapEnable(mouseEventTap, true);
CFRunLoopRun();
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码阻止了鼠标移动事件,因此其他应用程序不响应在其上移动的指针。但这并不能阻止指针本身移动。
编辑
我为什么要这样做?我正在记录鼠标增量,以通过网络控制另一台计算机。诸如Synergy和Teleport之类的应用程序可以执行此操作,但是光标仍在Synergy上可见(我上次检查过)。
我找到了一种编译此答案的方法。事实证明Synergy现在确实隐藏了光标。
在头文件中:
extern "C" {
typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();
}
Run Code Online (Sandbox Code Playgroud)
然后在源文件中:
CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
CFRelease(propertyString);
CGDisplayHideCursor(kCGDirectMainDisplay);
Run Code Online (Sandbox Code Playgroud)
这似乎是唯一的方法。
我想知道是否有更好的方法可以暂时禁用鼠标,但仍然记录运动。
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |