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