簡體   English   中英

如何讓 NSOpenPanel 在 Objective-C 中接受鍵盤和鼠標事件?

[英]How to make NSOpenPanel accept keyboard and mouse events in objective-c?

我有用 XCode 編寫的 C++ 控制台應用程序,我需要打開一個文件選擇器對話框。 為此,我將 Cocoa 與 Objective-c 一起使用。 我正在嘗試打開一個 NSOpenPanel 以將其用於此目的。 我目前正在使用以下代碼:

const char* saveDialog()
{
    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 運行代碼時,鼠標仍然表現得好像在 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM