我想隐藏状态栏应用程序中的光标,我做了一些研究。好像很久以前就找到了这个问题的解决方案:
Globally hide mouse cursor in Cocoa/Carbon?或http://lists.apple.com/archives/carbon-dev/2006/Jan/msg00555.html
但是引用的代码将无法编译。你们中的任何人都知道如何编译代码(通过导入一些旧的API或其他东西)或另一种实现这种方式(某种程度的黑客攻击)?
(我知道将光标隐藏在后台应用程序中通常是一个坏主意,但我制作的应用程序中此功能非常重要)
修改
这是旧的黑客,不再适用了。
long sysVers = GetSystemVersion();
// This trick doesn't work on 10.1
if (sysVers >= 0x1020)
{
void CGSSetConnectionProperty(int, int, int, int);
int CGSCreateCString(char *);
int CGSCreateBoolean(BOOL);
int _CGSDefaultConnection();
void CGSReleaseObj(int);
int propertyString, boolVal;
// Hack to make background cursor setting work
propertyString = CGSCreateCString("SetsCursorInBackground");
boolVal = CGSCreateBoolean(TRUE);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, boolVal);
CGSReleaseObj(propertyString);
CGSReleaseObj(boolVal);
}
它给了我4个错误:
“_ CGSCreateBoolean”,引自: - MyClass.o中的[MyClass myMethod]
“_ GetSystemVersion”,引自: - MyClass.o中的[MyClass myMethod]
“_ CGSCreateCString”,引自: - MyClass.o中的[MyClass myMethod]
“_ CGSReleaseObj”,引自: - MyClass.o中的[MyClass myMethod]
答案 0 :(得分:8)
您需要链接到Application Services框架以消除链接器错误。
以下是黑客的完整示例(更新为使用Core Foundation):
cat >t.c<<EOF
#include <ApplicationServices/ApplicationServices.h>
int main(void)
{
void CGSSetConnectionProperty(int, int, CFStringRef, CFBooleanRef);
int _CGSDefaultConnection();
CFStringRef propertyString;
// Hack to make background cursor setting work
propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingUTF8);
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
CFRelease(propertyString);
// Hide the cursor and wait
CGDisplayHideCursor(kCGDirectMainDisplay);
pause();
return 0;
}
EOF
gcc -framework ApplicationServices t.c
./a.out
在Mac OS 10.5上,这会隐藏光标直到程序中断。但是,执行任何窗口服务器或停靠任务都会显示光标。