package getlark

/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Cocoa/Cocoa.h>
#import <CoreGraphics/CGWindow.h>

static NSDictionary* FindChrome(void){
        NSArray *windows = (NSArray *)CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements|kCGWindowListOptionOnScreenOnly,kCGNullWindowID);
        NSLog(@"数组长度:%lu",windows.count);
        for(NSDictionary *window in windows)
            {
                NSString *currentApp = window[(NSString *)kCGWindowOwnerName];
                NSString *currentWindowTitle = window[(NSString *)kCGWindowName];
                if ([currentApp isEqualToString:@"Google Chrome"]){
                    NSDictionary *currentBounds= window[(NSString *)kCGWindowBounds];
                    NSLog(@"%@",currentBounds);
                    return currentBounds;
                    break;
                }
            }
}
*/
import "C"
import (
    "fmt"
    "reflect"
)

func GetLarkPos() {
    var dd *C.NSDictionary

    dd = C.FindChrome()
    fmt.Println(reflect.TypeOf(dd))
    fmt.Println(dd)

}

enter image description here个 图片上的值,如何调用Golang的函数

对不起,我不熟悉CGO和OBJECTIVE-C.我希望我能从你那里得到一些帮助.

推荐答案

不,cgo生成的getlark._Ctype_struct_NSDictionary当然不是Go map,所以dd["Height"]显然不会起作用.请注意,cgo是一个相当薄的层,它不会有任何特殊的魔力,比如以某种方式将C语言中的加法数组的随机实现转换为GO map.

您可能应该做的是在您的C部分(定义GetChrome的那个位)中编写将在NSDictionary上操作的助手代码.比方说,就像这样(完全未经测试):

char *getNSDictInt(NSDictionary *dict, char *key) int {
  s_key = convertKeyToNSString(key); /* must be implemented */
  return dict[s_key];
}

然后这样称呼他们:

dd := C.FindChrome()
height := C.getNSDictInt(dd, "Height")

您需要为您的NSDictionary可能包含的每种类型的值提供这样的"访问器".

(!)请注意,经过一些挖掘后,我发现NSDictionary中的密钥是NSString,这是UTF-16代码单元的序列,所以您必须使用类似this的东西来从传入的char *key中获得*NSString.(这也可以在GO方面完成,但让我们从小处开始.)

另一个解决方案应该是获得一个现成的包,该包已经准备好处理Cocoa API的代码类型--例如thisthis--这两个类型都是由simple search发现的.

Objective-c相关问答推荐

如何判断 iPhone 现在在哪个位置(横向或纵向)?

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

将 HEX NSString 转换为 NSData

静态和动态单元格的 UITableView 混合?

如何判断 Cocoa 和 Objective-C 中是否存在文件夹?

在 iOS 7 中检测后台应用刷新的用户设置

避免NSArray 在被枚举时发生Mutations

Xcode:可以为协议接口所需的方法自动创建存根吗?

如何在 XCode 中复制文件?

有没有办法更新单个 UITableViewCell 的高度,而无需重新计算每个单元格的高度?

UITableViewCell 右侧有图像?

如何从输入 IB 的 UILabel 文本中插入新行 \n?

仅在 UIView 顶部的圆角

每个 ivar 都必须是一个属性吗?

Objective-c 中 SEL 类型的属性

如何在 Cocoa 中获取当前日期

UITableView ,重新加载时滚动到底部?

iPhone:如何确定线程是否是主线程?

围绕其中心旋转 UIView 保持其大小

Facebook SDK 登录永远不会在 iOS 9 上回调我的应用程序