Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#&;键按F8(播放)按钮后阻止iTunes/Music.app启动;沙马林_C#_Macos_Visual Studio_Xamarin_Cocoa - Fatal编程技术网

使用C#&;键按F8(播放)按钮后阻止iTunes/Music.app启动;沙马林

使用C#&;键按F8(播放)按钮后阻止iTunes/Music.app启动;沙马林,c#,macos,visual-studio,xamarin,cocoa,C#,Macos,Visual Studio,Xamarin,Cocoa,正如我们所知,如果我们按F8(播放)键盘按钮,iTunes或Music.app将在macOS上默认打开。一些Swift类可用于阻止此键盘快捷键,但它们与C#&Xamarin不兼容。例如,Spotify macOS应用程序具有此功能。如果您在UI上按一次播放按钮,它将控制iTunes并处理“播放”按钮事件 我有这个代码块。但是,由于iTunes的原因,macOS无法触发代码块。其他键(如字母和数字)工作正常: private NSEvent KeyboardEventHandler(NSEvent

正如我们所知,如果我们按F8(播放)键盘按钮,iTunes或Music.app将在macOS上默认打开。一些Swift类可用于阻止此键盘快捷键,但它们与C#&Xamarin不兼容。例如,Spotify macOS应用程序具有此功能。如果您在UI上按一次播放按钮,它将控制iTunes并处理“播放”按钮事件

我有这个代码块。但是,由于iTunes的原因,macOS无法触发代码块。其他键(如字母和数字)工作正常:

private NSEvent KeyboardEventHandler(NSEvent theEvent)
    {


        ushort keyCode = theEvent.KeyCode;


        if(keyCode== 100) //rbKeyF8 100 is play button.
        {
            switch (isplaying)

            {
                case true:
                    StopMusic();
                    break;
                case false:
                    PlayMusic();
                    break;
            }
        }
        //    NSAlert a = new NSAlert()
        //{
        //    AlertStyle = NSAlertStyle.Informational,
        //    InformativeText = "You press the " + keyCode + " button :)",
        //    MessageText = "Hi"

        //};
        //a.RunModal();

        return theEvent;
    }
我们怎样才能用C#做到这一点?谢谢。

答案是: 注册一个新的子类

[Register ("App")]
public class App : NSApplication
{
    public App (System.IntPtr p) : base (p)
    {

    }

    public override void SendEvent (NSEvent theEvent)
    {
        base.SendEvent (theEvent);
    }
}
在Info.plist中更改PrincipalClass

<key>NSPrincipalClass</key>
<string>App</string>
NSPrincipalClass
应用程序
需要对NSApplication进行子类化,并查看sendEvent。您应该将Swift代码转换为C#。相关swift代码如下:

现在,我有另一个问题。是的,这个代码块解决了我的问题 第一部分。现在,我的应用程序响应“播放”按钮的按下。然而,iTunes 在我的应用程序响应后打开。如何防止它打开


您需要覆盖NSApplication类中的
SendEvent
,捕获(并处理)任何NSEvent.SystemDefined事件,并确定按下了哪些媒体键,等等。。。我手头没有Xamarin.Mac代码,但我最初转换了一些Swift代码,最后还查看了
SPMediaKeyTap
(在Github上)的ObjC代码。我无法在AppDelegate.cs和ViewController.cs中同时覆盖SendEvent。我将在哪里覆盖它?谢谢@sushihangover如果iTunes在应用程序响应后打开,我想他们会有一些冲突,Mac会优先控制iTunes。为了避免与iTunes快捷方式相同的冲突,您可以尝试其他快捷方式(F6或组合快捷方式)。