如何让 NSOpenPanel 在 objective-c 中接受键盘和鼠标事件?
How to make NSOpenPanel accept keyboard and mouse events in objective-c?
我有一个用 XCode 编写的 C++ 控制台应用程序,我需要打开一个文件选择器对话框。为此,我使用 Cocoa 和 objective-c。我正在尝试打开一个 NSOpenPanel 以将其用于此目的。我目前正在使用以下代码:
const char* openDialog()
{
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setFloatingPanel:YES];
if ( [openDlg runModal] == NSOKButton )
{
for( NSURL* URL in [openDlg URLs] )
{
NSLog( @"%@", [URL path] );
return [URL.path UTF8String];
}
}
return NULL;
}
这有效,但是创建的文件选择器不能正确接受鼠标和键盘事件。很难解释,但是例如,当我 运行 来自 XCode 的代码时,当鼠标悬停在 window 上方时,鼠标仍然表现得好像在 XCode 中,显示插入符号.当我 运行 来自终端的应用程序时,只要我键入内容,它就会将输入发送到终端,即使文件选择器在“前面”。不过,单击命令会将鼠标事件正确地传递给文件选择器。
我查看了 NSOpenPanel 的文档并在谷歌上广泛搜索了这个问题,但我找不到这个问题的答案。
/*
To run in Terminal: clang openpanel.m -fobjc-arc -framework Cocoa -o openpanel && ./openpanel
*/
#import <Cocoa/Cocoa.h>
int main() {
NSApplication *application = [NSApplication sharedApplication];
[application setActivationPolicy:NSApplicationActivationPolicyAccessory];
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setFloatingPanel:YES];
if ( [openDlg runModal] == NSModalResponseOK ) {
for( NSURL* URL in [openDlg URLs] ) {
NSLog( @"%@", [URL path] );
}
}
return 0;
}
感谢@Willeke。
我有一个用 XCode 编写的 C++ 控制台应用程序,我需要打开一个文件选择器对话框。为此,我使用 Cocoa 和 objective-c。我正在尝试打开一个 NSOpenPanel 以将其用于此目的。我目前正在使用以下代码:
const char* openDialog()
{
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setFloatingPanel:YES];
if ( [openDlg runModal] == NSOKButton )
{
for( NSURL* URL in [openDlg URLs] )
{
NSLog( @"%@", [URL path] );
return [URL.path UTF8String];
}
}
return NULL;
}
这有效,但是创建的文件选择器不能正确接受鼠标和键盘事件。很难解释,但是例如,当我 运行 来自 XCode 的代码时,当鼠标悬停在 window 上方时,鼠标仍然表现得好像在 XCode 中,显示插入符号.当我 运行 来自终端的应用程序时,只要我键入内容,它就会将输入发送到终端,即使文件选择器在“前面”。不过,单击命令会将鼠标事件正确地传递给文件选择器。
我查看了 NSOpenPanel 的文档并在谷歌上广泛搜索了这个问题,但我找不到这个问题的答案。
/*
To run in Terminal: clang openpanel.m -fobjc-arc -framework Cocoa -o openpanel && ./openpanel
*/
#import <Cocoa/Cocoa.h>
int main() {
NSApplication *application = [NSApplication sharedApplication];
[application setActivationPolicy:NSApplicationActivationPolicyAccessory];
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setFloatingPanel:YES];
if ( [openDlg runModal] == NSModalResponseOK ) {
for( NSURL* URL in [openDlg URLs] ) {
NSLog( @"%@", [URL path] );
}
}
return 0;
}
感谢@Willeke。