我想隐藏鼠标指针或阻止它在后台应用程序中全局移动。
我尝试过“CGDisplayHideCursor(kCGDirectMainDisplay);”,但这似乎只适用于前台应用程序。
这answer似乎是我最好的选择,但我无法编译。具体来说,我得到:
架构i386的未定义符号: “_CGSDefaultConnection()”,引自: _main在main.o中 “CGSSetConnectionProperty(int,int,__ CFString const *,__ CFBoolean const *)”,引自: _main in main.o
就隐藏指针而言,这段代码使用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);
}
上面的代码阻止了鼠标移动事件,因此其他应用程序不会响应移动它们的指针。但它并不能阻止指针本身移动。
修改
为什么我要这样做?我正在录制鼠标增量来控制网络上的另一台计算机。 Synergy和Teleport等应用程序执行此操作,但在Synergy上仍然可以看到光标(最后我检查过)。
答案 0 :(得分:4)
我找到了一种方法来进行answer编译。事实证明,Synergy现在隐藏了光标。
在头文件中:
extern "C" {
typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();
}
然后在源文件中:
CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
CFRelease(propertyString);
CGDisplayHideCursor(kCGDirectMainDisplay);
这似乎是唯一的方法。
我很想知道是否有更好的方法暂时禁用鼠标,但仍记录移动。