add code from commit 8644 from codeplex sources
This commit is contained in:
commit
d365eb62e4
49
.gitattributes
vendored
Normal file
49
.gitattributes
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
||||
|
||||
*.jpg binary
|
||||
*.png binary
|
||||
*.gif binary
|
||||
|
||||
*.cs text=auto diff=csharp
|
||||
*.vb text=auto
|
||||
*.c text=auto
|
||||
*.cpp text=auto
|
||||
*.cxx text=auto
|
||||
*.h text=auto
|
||||
*.hxx text=auto
|
||||
*.py text=auto
|
||||
*.rb text=auto
|
||||
*.java text=auto
|
||||
*.html text=auto
|
||||
*.htm text=auto
|
||||
*.css text=auto
|
||||
*.scss text=auto
|
||||
*.sass text=auto
|
||||
*.less text=auto
|
||||
*.js text=auto
|
||||
*.lisp text=auto
|
||||
*.clj text=auto
|
||||
*.sql text=auto
|
||||
*.php text=auto
|
||||
*.lua text=auto
|
||||
*.m text=auto
|
||||
*.asm text=auto
|
||||
*.erl text=auto
|
||||
*.fs text=auto
|
||||
*.fsx text=auto
|
||||
*.hs text=auto
|
||||
|
||||
*.csproj text=auto merge=union
|
||||
*.vbproj text=auto merge=union
|
||||
*.fsproj text=auto merge=union
|
||||
*.dbproj text=auto merge=union
|
||||
*.sln text=auto eol=crlf merge=union
|
165
.gitignore
vendored
Normal file
165
.gitignore
vendored
Normal file
|
@ -0,0 +1,165 @@
|
|||
|
||||
#################
|
||||
## Eclipse
|
||||
#################
|
||||
|
||||
*.pydevproject
|
||||
.project
|
||||
.metadata
|
||||
bin/**
|
||||
tmp/**
|
||||
tmp/**/*
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# CDT-specific
|
||||
.cproject
|
||||
|
||||
# PDT-specific
|
||||
.buildpath
|
||||
|
||||
|
||||
#################
|
||||
## Visual Studio
|
||||
#################
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
**/[Dd]ebug/
|
||||
**/[Rr]elease/
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.vspscc
|
||||
.builds
|
||||
**/*.dotCover
|
||||
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment this
|
||||
#**/packages/
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish
|
||||
|
||||
# Others
|
||||
[Bb]in
|
||||
[Oo]bj
|
||||
sql
|
||||
TestResults
|
||||
*.Cache
|
||||
ClientBin
|
||||
stylecop.*
|
||||
~$*
|
||||
*.dbmdl
|
||||
Generated_Code #added for RIA/Silverlight projects
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
|
||||
|
||||
|
||||
############
|
||||
## Windows
|
||||
############
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
|
||||
#############
|
||||
## Python
|
||||
#############
|
||||
|
||||
*.py[co]
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist
|
||||
build
|
||||
eggs
|
||||
parts
|
||||
bin
|
||||
var
|
||||
sdist
|
||||
develop-eggs
|
||||
.installed.cfg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
|
||||
#Translations
|
||||
*.mo
|
||||
|
||||
#Mr Developer
|
||||
.mr.developer.cfg
|
||||
|
||||
# Mac crap
|
||||
.DS_Store
|
20
AppleWirelessKeyboard.sln
Normal file
20
AppleWirelessKeyboard.sln
Normal file
|
@ -0,0 +1,20 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppleWirelessKeyboard", "AppleWirelessKeyboard\AppleWirelessKeyboard.csproj", "{9654B149-302A-4392-8F91-4202FA6E0AE4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{9654B149-302A-4392-8F91-4202FA6E0AE4}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{9654B149-302A-4392-8F91-4202FA6E0AE4}.Debug|x86.Build.0 = Debug|x86
|
||||
{9654B149-302A-4392-8F91-4202FA6E0AE4}.Release|x86.ActiveCfg = Release|x86
|
||||
{9654B149-302A-4392-8F91-4202FA6E0AE4}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
4
AppleWirelessKeyboard/App.xaml
Normal file
4
AppleWirelessKeyboard/App.xaml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<Application x:Class="AppleWirelessKeyboard.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Startup="Application_Startup" Exit="Application_Exit"/>
|
104
AppleWirelessKeyboard/App.xaml.cs
Normal file
104
AppleWirelessKeyboard/App.xaml.cs
Normal file
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Diagnostics;
|
||||
using System.Timers;
|
||||
using System.Threading;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
public static MainWindow Window { get; set; }
|
||||
|
||||
private void Application_Startup(object sender, StartupEventArgs e)
|
||||
{
|
||||
TrayIcon.Show();
|
||||
uxsoft.VersionCheck();
|
||||
|
||||
if (!StartupShortcut.IsRegistered)
|
||||
StartupShortcut.Register();
|
||||
|
||||
if (Process.GetProcessesByName(Application.ResourceAssembly.GetName().Name).Length > 1)
|
||||
{
|
||||
var processes = Process.GetProcessesByName(Application.ResourceAssembly.GetName().Name);
|
||||
foreach (Process p in processes)
|
||||
if (p != Process.GetCurrentProcess())
|
||||
p.Kill();
|
||||
}
|
||||
|
||||
Window = new MainWindow();
|
||||
|
||||
AppleKeyboardHID2.Start();
|
||||
AppleKeyboardHID2.KeyDown += new AppleKeyboardHID2.AppleHIDKeyboardEventHandler(AppleKeyboardHID_KeyDown);
|
||||
AppleKeyboardHID2.KeyUp += new AppleKeyboardHID2.AppleHIDKeyboardEventHandler(AppleKeyboardHID_KeyUp);
|
||||
|
||||
KeyboardListener.HookedKeys.Add(Key.F2);
|
||||
KeyboardListener.HookedKeys.Add(Key.F3);
|
||||
KeyboardListener.HookedKeys.Add(Key.F4);
|
||||
KeyboardListener.HookedKeys.Add(Key.F7);
|
||||
KeyboardListener.HookedKeys.Add(Key.F8);
|
||||
KeyboardListener.HookedKeys.Add(Key.F9);
|
||||
KeyboardListener.HookedKeys.Add(Key.F10);
|
||||
KeyboardListener.HookedKeys.Add(Key.F11);
|
||||
KeyboardListener.HookedKeys.Add(Key.F12);
|
||||
KeyboardListener.HookedKeys.Add(Key.Back);
|
||||
KeyboardListener.HookedKeys.Add(Key.Up);
|
||||
KeyboardListener.HookedKeys.Add(Key.Left);
|
||||
KeyboardListener.HookedKeys.Add(Key.Right);
|
||||
KeyboardListener.HookedKeys.Add(Key.Down);
|
||||
KeyboardListener.HookedKeys.Add(Key.Enter);
|
||||
KeyboardListener.Register();
|
||||
KeyboardListener.KeyDown += new KeyboardListener.KeyHookEventHandler(KeyboardListener_KeyDown);
|
||||
|
||||
Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
|
||||
}
|
||||
|
||||
void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
|
||||
{
|
||||
if (e.Mode == Microsoft.Win32.PowerModes.Resume)
|
||||
{
|
||||
Thread.Sleep(16000);
|
||||
AppleKeyboardHID2.Shutdown();
|
||||
AppleKeyboardHID2.Start();
|
||||
}
|
||||
}
|
||||
|
||||
void AppleKeyboardHID_KeyUp(AppleKeyboardSpecialKeys key)
|
||||
{
|
||||
if (key == AppleKeyboardSpecialKeys.Fn)
|
||||
KeyboardListener.ModifierFn = false;
|
||||
}
|
||||
|
||||
void AppleKeyboardHID_KeyDown(AppleKeyboardSpecialKeys key)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case AppleKeyboardSpecialKeys.Fn:
|
||||
KeyboardListener.ModifierFn = true;
|
||||
break;
|
||||
case AppleKeyboardSpecialKeys.Eject:
|
||||
KeyboardHandler.HandleEject();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool KeyboardListener_KeyDown(KeyboardListener.KeyHookEventArgs e)
|
||||
{
|
||||
return KeyboardHandler.HandleKeyDown(e);
|
||||
}
|
||||
|
||||
private void Application_Exit(object sender, ExitEventArgs e)
|
||||
{
|
||||
KeyboardListener.UnRegister();
|
||||
AppleKeyboardHID2.Shutdown();
|
||||
}
|
||||
}
|
||||
}
|
227
AppleWirelessKeyboard/AppleKeyboardHID2.cs
Normal file
227
AppleWirelessKeyboard/AppleKeyboardHID2.cs
Normal file
|
@ -0,0 +1,227 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using AppleWirelessKeyboard;
|
||||
using System.Runtime.InteropServices;
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
using System.Windows.Forms;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public class AppleKeyboardHID2
|
||||
{
|
||||
// Fields
|
||||
static Stream _stream;
|
||||
static bool CurrentPowerButtonIsDown;
|
||||
public const int VIDApple = 0x5ac;
|
||||
|
||||
// Events
|
||||
public static event EventHandler Disconnected;
|
||||
public delegate void AppleHIDKeyboardEventHandler(AppleKeyboardSpecialKeys key);
|
||||
public static event AppleHIDKeyboardEventHandler KeyUp;
|
||||
public static event AppleHIDKeyboardEventHandler KeyDown;
|
||||
|
||||
//Properties
|
||||
public static bool FnDown { get; set; }
|
||||
public static bool EjectDown { get; set; }
|
||||
public static bool PowerButtonDown { get; set; }
|
||||
public static bool Registered
|
||||
{
|
||||
get { return _stream != null; }
|
||||
}
|
||||
|
||||
public static void Shutdown()
|
||||
{
|
||||
if (_stream != null)
|
||||
{
|
||||
_stream.Close();
|
||||
_stream = null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void SpecialKeyStateChanged(IAsyncResult ar)
|
||||
{
|
||||
if ((_stream != null) && ar.IsCompleted)
|
||||
{
|
||||
try
|
||||
{
|
||||
_stream.EndRead(ar);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
if (Disconnected != null)
|
||||
{
|
||||
Disconnected(null, EventArgs.Empty);
|
||||
}
|
||||
return;
|
||||
}
|
||||
byte[] asyncState = ar.AsyncState as byte[];
|
||||
byte[] buffer2 = asyncState;
|
||||
for (int i = 0; i < buffer2.Length; i++)
|
||||
{
|
||||
byte num1 = buffer2[i];
|
||||
}
|
||||
if (asyncState[0] == 0x11)
|
||||
{
|
||||
switch (asyncState[1])
|
||||
{
|
||||
case 24:
|
||||
{
|
||||
EjectDown = true;
|
||||
FnDown = true;
|
||||
if (KeyDown != null)
|
||||
KeyDown(AppleKeyboardSpecialKeys.Eject);
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
{
|
||||
if (EjectDown)
|
||||
{
|
||||
EjectDown = false;
|
||||
if (KeyUp != null)
|
||||
KeyUp(AppleKeyboardSpecialKeys.Eject);
|
||||
}
|
||||
FnDown = true;
|
||||
if (KeyDown != null)
|
||||
KeyDown(AppleKeyboardSpecialKeys.Fn);
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
{
|
||||
if (FnDown)
|
||||
{
|
||||
FnDown = false;
|
||||
if (KeyUp != null)
|
||||
KeyUp(AppleKeyboardSpecialKeys.Fn);
|
||||
}
|
||||
EjectDown = true;
|
||||
if (KeyDown != null)
|
||||
KeyDown(AppleKeyboardSpecialKeys.Eject);
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
{
|
||||
if (EjectDown)
|
||||
{
|
||||
EjectDown = false;
|
||||
if (KeyUp != null)
|
||||
KeyUp(AppleKeyboardSpecialKeys.Eject);
|
||||
}
|
||||
if (FnDown)
|
||||
{
|
||||
FnDown = false;
|
||||
if (KeyUp != null)
|
||||
KeyUp(AppleKeyboardSpecialKeys.Fn);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (asyncState[0] == 0x13)
|
||||
{
|
||||
CurrentPowerButtonIsDown = asyncState[1] == 1;
|
||||
}
|
||||
_stream.BeginRead(asyncState, 0, asyncState.Length, new AsyncCallback(SpecialKeyStateChanged), asyncState);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool Start()
|
||||
{
|
||||
Guid guid;
|
||||
HIDImports.SP_DEVICE_INTERFACE_DATA sp_device_interface_data = new HIDImports.SP_DEVICE_INTERFACE_DATA() { cbSize = Marshal.SizeOf(typeof(HIDImports.SP_DEVICE_INTERFACE_DATA)) };
|
||||
|
||||
if (_stream != null)
|
||||
{
|
||||
throw new InvalidOperationException("No Stream!");
|
||||
}
|
||||
|
||||
HIDImports.HidD_GetHidGuid(out guid);
|
||||
IntPtr hDevInfo = HIDImports.SetupDiGetClassDevs(ref guid, null, IntPtr.Zero, 0x10);
|
||||
|
||||
int num = 0;
|
||||
while (HIDImports.SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref guid, num++, ref sp_device_interface_data))
|
||||
{
|
||||
uint num2;
|
||||
HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = new HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA { cbSize = (IntPtr.Size == 8) ? (uint)8 : (uint)5 };
|
||||
|
||||
HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref sp_device_interface_data, IntPtr.Zero, 0, out num2, IntPtr.Zero);
|
||||
if (HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref sp_device_interface_data, ref deviceInterfaceDetailData, num2, out num2, IntPtr.Zero))
|
||||
{
|
||||
HIDImports.HIDD_ATTRIBUTES hidd_attributes = new HIDImports.HIDD_ATTRIBUTES() { Size = Marshal.SizeOf(typeof(HIDImports.HIDD_ATTRIBUTES)) };
|
||||
|
||||
SafeFileHandle handle = HIDImports.CreateFile(deviceInterfaceDetailData.DevicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, HIDImports.EFileAttributes.Overlapped, IntPtr.Zero);
|
||||
|
||||
if (HIDImports.HidD_GetAttributes(handle.DangerousGetHandle(), ref hidd_attributes))
|
||||
{
|
||||
if (IsAppleWirelessKeyboard(hidd_attributes.VendorID, hidd_attributes.ProductID))
|
||||
{
|
||||
_stream = new FileStream(handle, FileAccess.ReadWrite, 0x16, true);
|
||||
//break;
|
||||
}
|
||||
else
|
||||
{
|
||||
handle.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HIDImports.SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
|
||||
if (_stream != null)
|
||||
{
|
||||
byte[] buffer = new byte[0x16];
|
||||
_stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(SpecialKeyStateChanged), buffer);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool IsAppleWirelessKeyboard(int vid, int pid)
|
||||
{
|
||||
if (vid == VIDApple)
|
||||
{
|
||||
Guid HIDGUID;
|
||||
HIDImports.HidD_GetHidGuid(out HIDGUID);
|
||||
|
||||
IntPtr DeviceInfo = HIDImports.SetupDiGetClassDevs(ref HIDGUID, null, IntPtr.Zero, 16);
|
||||
|
||||
uint MemberIndex = 0;
|
||||
|
||||
HIDImports.SP_DEVINFO_DATA DID = new HIDImports.SP_DEVINFO_DATA() { cbSize = (uint)Marshal.SizeOf(typeof(HIDImports.SP_DEVINFO_DATA)) };
|
||||
|
||||
while (HIDImports.SetupDiEnumDeviceInfo(DeviceInfo, MemberIndex++, ref DID))
|
||||
{
|
||||
uint RequiredSize = 0;
|
||||
uint PropertyDataType = 0;
|
||||
IntPtr buffer = Marshal.AllocHGlobal(512);
|
||||
string CLASS = "";
|
||||
|
||||
|
||||
if (HIDImports.SetupDiGetDeviceRegistryProperty(DeviceInfo, ref DID, (uint)HIDImports.SPDRP.SPDRP_CLASS, out PropertyDataType, buffer, 512, out RequiredSize))
|
||||
CLASS = Marshal.PtrToStringAuto(buffer);
|
||||
|
||||
if (CLASS.Equals("Keyboard", StringComparison.InvariantCultureIgnoreCase))
|
||||
return true;
|
||||
}
|
||||
|
||||
HIDImports.SetupDiDestroyDeviceInfoList(DeviceInfo);
|
||||
|
||||
return true;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
}
|
||||
public enum AppleKeyboardSpecialKeys : byte
|
||||
{
|
||||
//Fn + Eject = 24
|
||||
Fn = 16,
|
||||
Eject = 8,
|
||||
PowerButton = 3
|
||||
//None = 0
|
||||
}
|
||||
}
|
358
AppleWirelessKeyboard/AppleWirelessKeyboard.csproj
Normal file
358
AppleWirelessKeyboard/AppleWirelessKeyboard.csproj
Normal file
|
@ -0,0 +1,358 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{9654B149-302A-4392-8F91-4202FA6E0AE4}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>AppleWirelessKeyboard</RootNamespace>
|
||||
<AssemblyName>AppleWirelessKeyboard</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<IsWebBootstrapper>true</IsWebBootstrapper>
|
||||
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
||||
<SccProjectName>
|
||||
</SccProjectName>
|
||||
<SccLocalPath>
|
||||
</SccLocalPath>
|
||||
<SccAuxPath>
|
||||
</SccAuxPath>
|
||||
<SccProvider>
|
||||
</SccProvider>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Web</InstallFrom>
|
||||
<UpdateEnabled>true</UpdateEnabled>
|
||||
<UpdateMode>Background</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<InstallUrl>http://applewirelesskbrd.codeplex.com/releases/clickonce/</InstallUrl>
|
||||
<UpdateUrl>http://applewirelesskbrd.codeplex.com/releases/clickonce/</UpdateUrl>
|
||||
<SupportUrl>http://applewirelesskbrd.codeplex.com</SupportUrl>
|
||||
<ProductName>AppleWirelessKeyboard</ProductName>
|
||||
<PublisherName>X-soft</PublisherName>
|
||||
<SuiteName>AppleWirelessKeyboard</SuiteName>
|
||||
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
|
||||
<WebPage>publish.htm</WebPage>
|
||||
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
|
||||
<TrustUrlParameters>true</TrustUrlParameters>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>2.1.0.0</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestCertificateThumbprint>902A841B3FDD641CBAF24748EC3D69DFF5ECCF12</ManifestCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestKeyFile>AppleWirelessKeyboard_TemporaryKey.pfx</ManifestKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<GenerateManifests>true</GenerateManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>true</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>Gnome-Preferences-Desktop-Keyboard-Shortcuts.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject>AppleWirelessKeyboard.App</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Runtime.Remoting" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Xaml">
|
||||
<RequiredTargetFramework>4.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ApplicationDefinition Include="App.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="AppleKeyboardHID2.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndpointVolume.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndpointVolumeCallback.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndpointVolumeChannel.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndpointVolumeChannels.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndpointVolumeNotificationDelegate.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndpointVolumeStepInformation.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioEndPointVolumeVolumeRange.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioMeterInformation.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioMeterInformationChannels.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioSessionControl.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioSessionDisconnectReason.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioSessionManager.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioSessionState.cs" />
|
||||
<Compile Include="CoreAudioAPI\AudioVolumeNotificationData.cs" />
|
||||
<Compile Include="CoreAudioAPI\AUDIO_VOLUME_NOTIFICATION_DATA.cs" />
|
||||
<Compile Include="CoreAudioAPI\Blob.cs" />
|
||||
<Compile Include="CoreAudioAPI\CLSCTX.cs" />
|
||||
<Compile Include="CoreAudioAPI\EDataFlow.cs" />
|
||||
<Compile Include="CoreAudioAPI\EDeviceState.cs" />
|
||||
<Compile Include="CoreAudioAPI\EEndpointHardwareSupport.cs" />
|
||||
<Compile Include="CoreAudioAPI\ERole.cs" />
|
||||
<Compile Include="CoreAudioAPI\eStgmAccess.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioEndpointVolume.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioEndpointVolumeCallback.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioMeterInformation.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioPeakMeter.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioSessionControl2.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioSessionEnumerator.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioSessionEvents.cs" />
|
||||
<Compile Include="CoreAudioAPI\IAudioSessionManager2.cs" />
|
||||
<Compile Include="CoreAudioAPI\IMMDevice.cs" />
|
||||
<Compile Include="CoreAudioAPI\IMMDeviceCollection.cs" />
|
||||
<Compile Include="CoreAudioAPI\IMMDeviceEnumerator.cs" />
|
||||
<Compile Include="CoreAudioAPI\IMMEndpoint.cs" />
|
||||
<Compile Include="CoreAudioAPI\IPropertyStore.cs" />
|
||||
<Compile Include="CoreAudioAPI\ISimpleAudioVolume.cs" />
|
||||
<Compile Include="CoreAudioAPI\MMDevice.cs" />
|
||||
<Compile Include="CoreAudioAPI\MMDeviceCollection.cs" />
|
||||
<Compile Include="CoreAudioAPI\MMDeviceEnumerator.cs" />
|
||||
<Compile Include="CoreAudioAPI\PKEY.cs" />
|
||||
<Compile Include="CoreAudioAPI\PropertyKey.cs" />
|
||||
<Compile Include="CoreAudioAPI\PropertyStore.cs" />
|
||||
<Compile Include="CoreAudioAPI\PropertyStoreProperty.cs" />
|
||||
<Compile Include="CoreAudioAPI\PropVariant.cs" />
|
||||
<Compile Include="CoreAudioAPI\SessionCollection.cs" />
|
||||
<Compile Include="CoreAudioAPI\SimpleAudioVolume.cs" />
|
||||
<Compile Include="Glyphs\Eject.xaml.cs">
|
||||
<DependentUpon>Eject.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\MuteOff.xaml.cs">
|
||||
<DependentUpon>MuteOff.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\MuteOn.xaml.cs">
|
||||
<DependentUpon>MuteOn.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\Next.xaml.cs">
|
||||
<DependentUpon>Next.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\Off.xaml.cs">
|
||||
<DependentUpon>Off.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\On.xaml.cs">
|
||||
<DependentUpon>On.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\PlayPause.xaml.cs">
|
||||
<DependentUpon>PlayPause.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\Previous.xaml.cs">
|
||||
<DependentUpon>Previous.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\PrintScreen.xaml.cs">
|
||||
<DependentUpon>PrintScreen.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\TaskManager.xaml.cs">
|
||||
<DependentUpon>TaskManager.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\VolumeOff.xaml.cs">
|
||||
<DependentUpon>VolumeOff.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Glyphs\VolumeOn.xaml.cs">
|
||||
<DependentUpon>VolumeOn.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="HIDImports.cs" />
|
||||
<Compile Include="IoControl.cs" />
|
||||
<Compile Include="iTunesControl.cs" />
|
||||
<Compile Include="KeyboardControl.cs" />
|
||||
<Compile Include="KeyboardHandler.cs" />
|
||||
<Compile Include="KeyboardListener.cs" />
|
||||
<Compile Include="NotificationCenter.cs" />
|
||||
<Compile Include="PowerControl.cs" />
|
||||
<Compile Include="PowerStatusBox.xaml.cs">
|
||||
<DependentUpon>PowerStatusBox.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="StartupShortcut.cs" />
|
||||
<Compile Include="TrayIcon.cs" />
|
||||
<Compile Include="uxsoft.cs" />
|
||||
<Compile Include="Views\Configuration.xaml.cs">
|
||||
<DependentUpon>Configuration.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="VolumeControl.cs" />
|
||||
<Page Include="Glyphs\Eject.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\MuteOff.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\MuteOn.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\Next.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\Off.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\On.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\PlayPause.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\Previous.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\PrintScreen.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\TaskManager.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\VolumeOff.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Glyphs\VolumeOn.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="App.xaml.cs">
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="MainWindow.xaml.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Page Include="PowerStatusBox.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\Configuration.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<None Include="app.config" />
|
||||
<None Include="AppleWirelessKeyboard_TemporaryKey.pfx" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<AppDesigner Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4 Client Profile %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Windows Installer 3.1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Gnome-Preferences-Desktop-Keyboard-Shortcuts.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<COMReference Include="iTunesLib">
|
||||
<Guid>{9E93C96F-CF0D-43F6-8BA8-B807A3370712}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>13</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>if /I "$(ConfigurationName)" == "Release" Eazfuscator.NET.exe "$(TargetPath)" --msbuild-project-path "$(ProjectPath)" --msbuild-project-configuration "$(ConfigurationName)" --msbuild-project-platform "$(PlatformName)" -n --newline-flush -v 2.9</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
BIN
AppleWirelessKeyboard/AppleWirelessKeyboard_TemporaryKey.pfx
Normal file
BIN
AppleWirelessKeyboard/AppleWirelessKeyboard_TemporaryKey.pfx
Normal file
Binary file not shown.
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
internal struct AUDIO_VOLUME_NOTIFICATION_DATA
|
||||
{
|
||||
public Guid guidEventContext;
|
||||
public bool bMuted;
|
||||
public float fMasterVolume;
|
||||
public uint nChannels;
|
||||
public float ChannelVolume;
|
||||
|
||||
//Code Should Compile at warning level4 without any warnings,
|
||||
//However this struct will give us Warning CS0649: Field [Fieldname]
|
||||
//is never assigned to, and will always have its default value
|
||||
//You can disable CS0649 in the project options but that will disable
|
||||
//the warning for the whole project, it's a nice warning and we do want
|
||||
//it in other places so we make a nice dummy function to keep the compiler
|
||||
//happy.
|
||||
private void FixCS0649()
|
||||
{
|
||||
guidEventContext = Guid.Empty;
|
||||
bMuted = false;
|
||||
fMasterVolume = 0;
|
||||
nChannels = 0;
|
||||
ChannelVolume = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioEndPointVolumeVolumeRange
|
||||
{
|
||||
float _VolumeMindB;
|
||||
float _VolumeMaxdB;
|
||||
float _VolumeIncrementdB;
|
||||
|
||||
internal AudioEndPointVolumeVolumeRange(IAudioEndpointVolume parent)
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(parent.GetVolumeRange(out _VolumeMindB,out _VolumeMaxdB,out _VolumeIncrementdB));
|
||||
}
|
||||
|
||||
public float MindB
|
||||
{
|
||||
get
|
||||
{
|
||||
return _VolumeMindB;
|
||||
}
|
||||
}
|
||||
|
||||
public float MaxdB
|
||||
{
|
||||
get
|
||||
{
|
||||
return _VolumeMaxdB;
|
||||
}
|
||||
}
|
||||
|
||||
public float IncrementdB
|
||||
{
|
||||
get
|
||||
{
|
||||
return _VolumeIncrementdB;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
157
AppleWirelessKeyboard/CoreAudioAPI/AudioEndpointVolume.cs
Normal file
157
AppleWirelessKeyboard/CoreAudioAPI/AudioEndpointVolume.cs
Normal file
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
|
||||
public class AudioEndpointVolume : IDisposable
|
||||
{
|
||||
private IAudioEndpointVolume _AudioEndPointVolume;
|
||||
private AudioEndpointVolumeChannels _Channels;
|
||||
private AudioEndpointVolumeStepInformation _StepInformation;
|
||||
private AudioEndPointVolumeVolumeRange _VolumeRange;
|
||||
private EEndpointHardwareSupport _HardwareSupport;
|
||||
private AudioEndpointVolumeCallback _CallBack;
|
||||
public event AudioEndpointVolumeNotificationDelegate OnVolumeNotification;
|
||||
|
||||
public AudioEndPointVolumeVolumeRange VolumeRange
|
||||
{
|
||||
get
|
||||
{
|
||||
return _VolumeRange;
|
||||
}
|
||||
}
|
||||
public EEndpointHardwareSupport HardwareSupport
|
||||
{
|
||||
get
|
||||
{
|
||||
return _HardwareSupport;
|
||||
}
|
||||
}
|
||||
public AudioEndpointVolumeStepInformation StepInformation
|
||||
{
|
||||
get
|
||||
{
|
||||
return _StepInformation;
|
||||
}
|
||||
}
|
||||
public AudioEndpointVolumeChannels Channels
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Channels;
|
||||
}
|
||||
}
|
||||
public float MasterVolumeLevel
|
||||
{
|
||||
get
|
||||
{
|
||||
float result;
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.GetMasterVolumeLevel(out result));
|
||||
return result;
|
||||
}
|
||||
set
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.SetMasterVolumeLevel(value, Guid.Empty));
|
||||
}
|
||||
}
|
||||
public float MasterVolumeLevelScalar
|
||||
{
|
||||
get
|
||||
{
|
||||
float result;
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.GetMasterVolumeLevelScalar(out result));
|
||||
return result;
|
||||
}
|
||||
set
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.SetMasterVolumeLevelScalar(value, Guid.Empty));
|
||||
}
|
||||
}
|
||||
public bool Mute
|
||||
{
|
||||
get
|
||||
{
|
||||
bool result;
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.GetMute(out result));
|
||||
return result;
|
||||
}
|
||||
set
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.SetMute(value, Guid.Empty));
|
||||
}
|
||||
}
|
||||
public void VolumeStepUp()
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.VolumeStepUp(Guid.Empty));
|
||||
}
|
||||
public void VolumeStepDown()
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.VolumeStepDown(Guid.Empty));
|
||||
}
|
||||
internal AudioEndpointVolume(IAudioEndpointVolume realEndpointVolume)
|
||||
{
|
||||
uint HardwareSupp;
|
||||
|
||||
_AudioEndPointVolume = realEndpointVolume;
|
||||
_Channels = new AudioEndpointVolumeChannels(_AudioEndPointVolume);
|
||||
_StepInformation = new AudioEndpointVolumeStepInformation(_AudioEndPointVolume);
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.QueryHardwareSupport(out HardwareSupp));
|
||||
_HardwareSupport = (EEndpointHardwareSupport)HardwareSupp;
|
||||
_VolumeRange = new AudioEndPointVolumeVolumeRange(_AudioEndPointVolume);
|
||||
_CallBack = new AudioEndpointVolumeCallback(this);
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.RegisterControlChangeNotify( _CallBack));
|
||||
}
|
||||
internal void FireNotification(AudioVolumeNotificationData NotificationData)
|
||||
{
|
||||
AudioEndpointVolumeNotificationDelegate del = OnVolumeNotification;
|
||||
if (del != null)
|
||||
{
|
||||
del(NotificationData);
|
||||
}
|
||||
}
|
||||
#region IDisposable Members
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_CallBack != null)
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.UnregisterControlChangeNotify( _CallBack ));
|
||||
_CallBack = null;
|
||||
}
|
||||
}
|
||||
|
||||
~AudioEndpointVolume()
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
// This class implements the IAudioEndpointVolumeCallback interface,
|
||||
// it is implemented in this class because implementing it on AudioEndpointVolume
|
||||
// (where the functionality is really wanted, would cause the OnNotify function
|
||||
// to show up in the public API.
|
||||
internal class AudioEndpointVolumeCallback : IAudioEndpointVolumeCallback
|
||||
{
|
||||
private AudioEndpointVolume _Parent;
|
||||
|
||||
internal AudioEndpointVolumeCallback(AudioEndpointVolume parent)
|
||||
{
|
||||
_Parent = parent;
|
||||
}
|
||||
|
||||
[PreserveSig] public int OnNotify(IntPtr NotifyData)
|
||||
{
|
||||
//Since AUDIO_VOLUME_NOTIFICATION_DATA is dynamic in length based on the
|
||||
//number of audio channels available we cannot just call PtrToStructure
|
||||
//to get all data, thats why it is split up into two steps, first the static
|
||||
//data is marshalled into the data structure, then with some IntPtr math the
|
||||
//remaining floats are read from memory.
|
||||
//
|
||||
AUDIO_VOLUME_NOTIFICATION_DATA data = (AUDIO_VOLUME_NOTIFICATION_DATA) Marshal.PtrToStructure(NotifyData, typeof(AUDIO_VOLUME_NOTIFICATION_DATA));
|
||||
|
||||
//Determine offset in structure of the first float
|
||||
IntPtr Offset = Marshal.OffsetOf(typeof(AUDIO_VOLUME_NOTIFICATION_DATA),"ChannelVolume");
|
||||
//Determine offset in memory of the first float
|
||||
IntPtr FirstFloatPtr = (IntPtr)((long)NotifyData + (long)Offset);
|
||||
|
||||
float[] voldata = new float[data.nChannels];
|
||||
|
||||
//Read all floats from memory.
|
||||
for (int i = 0; i < data.nChannels; i++)
|
||||
{
|
||||
voldata[i] = (float)Marshal.PtrToStructure(FirstFloatPtr, typeof(float));
|
||||
}
|
||||
|
||||
//Create combined structure and Fire Event in parent class.
|
||||
AudioVolumeNotificationData NotificationData = new AudioVolumeNotificationData(data.guidEventContext, data.bMuted, data.fMasterVolume, voldata);
|
||||
_Parent.FireNotification(NotificationData);
|
||||
return 0; //S_OK
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioEndpointVolumeChannel
|
||||
{
|
||||
private uint _Channel;
|
||||
private IAudioEndpointVolume _AudioEndpointVolume;
|
||||
|
||||
internal AudioEndpointVolumeChannel(IAudioEndpointVolume parent, int channel)
|
||||
{
|
||||
_Channel = (uint)channel;
|
||||
_AudioEndpointVolume = parent;
|
||||
}
|
||||
|
||||
public float VolumeLevel
|
||||
{
|
||||
get
|
||||
{
|
||||
float result;
|
||||
Marshal.ThrowExceptionForHR(_AudioEndpointVolume.GetChannelVolumeLevel(_Channel,out result));
|
||||
return result;
|
||||
}
|
||||
set
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndpointVolume.SetChannelVolumeLevel(_Channel, value,Guid.Empty));
|
||||
}
|
||||
}
|
||||
|
||||
public float VolumeLevelScalar
|
||||
{
|
||||
get
|
||||
{
|
||||
float result;
|
||||
Marshal.ThrowExceptionForHR(_AudioEndpointVolume.GetChannelVolumeLevelScalar(_Channel, out result));
|
||||
return result;
|
||||
}
|
||||
set
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioEndpointVolume.SetChannelVolumeLevelScalar(_Channel, value, Guid.Empty));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioEndpointVolumeChannels
|
||||
{
|
||||
IAudioEndpointVolume _AudioEndPointVolume;
|
||||
AudioEndpointVolumeChannel[] _Channels;
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
int result;
|
||||
Marshal.ThrowExceptionForHR(_AudioEndPointVolume.GetChannelCount(out result));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public AudioEndpointVolumeChannel this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Channels[index];
|
||||
}
|
||||
}
|
||||
|
||||
internal AudioEndpointVolumeChannels(IAudioEndpointVolume parent)
|
||||
{
|
||||
int ChannelCount;
|
||||
_AudioEndPointVolume = parent;
|
||||
|
||||
ChannelCount = Count;
|
||||
_Channels = new AudioEndpointVolumeChannel[ChannelCount];
|
||||
for (int i = 0; i < ChannelCount; i++)
|
||||
{
|
||||
_Channels[i] = new AudioEndpointVolumeChannel(_AudioEndPointVolume, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public delegate void AudioEndpointVolumeNotificationDelegate( AudioVolumeNotificationData data);
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioEndpointVolumeStepInformation
|
||||
{
|
||||
private uint _Step;
|
||||
private uint _StepCount;
|
||||
internal AudioEndpointVolumeStepInformation(IAudioEndpointVolume parent)
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(parent.GetVolumeStepInfo(out _Step, out _StepCount));
|
||||
}
|
||||
|
||||
public uint Step
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Step;
|
||||
}
|
||||
}
|
||||
|
||||
public uint StepCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return _StepCount;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
79
AppleWirelessKeyboard/CoreAudioAPI/AudioMeterInformation.cs
Normal file
79
AppleWirelessKeyboard/CoreAudioAPI/AudioMeterInformation.cs
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioMeterInformation
|
||||
{
|
||||
private IAudioMeterInformation _AudioMeterInformation;
|
||||
private EEndpointHardwareSupport _HardwareSupport;
|
||||
private AudioMeterInformationChannels _Channels;
|
||||
|
||||
internal AudioMeterInformation(IAudioMeterInformation realInterface)
|
||||
{
|
||||
int HardwareSupp;
|
||||
|
||||
_AudioMeterInformation = realInterface;
|
||||
Marshal.ThrowExceptionForHR(_AudioMeterInformation.QueryHardwareSupport(out HardwareSupp));
|
||||
_HardwareSupport = (EEndpointHardwareSupport)HardwareSupp;
|
||||
_Channels = new AudioMeterInformationChannels(_AudioMeterInformation);
|
||||
|
||||
}
|
||||
|
||||
public AudioMeterInformationChannels PeakValues
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Channels;
|
||||
}
|
||||
}
|
||||
|
||||
public EEndpointHardwareSupport HardwareSupport
|
||||
{
|
||||
get
|
||||
{
|
||||
return _HardwareSupport;
|
||||
}
|
||||
}
|
||||
|
||||
public float MasterPeakValue
|
||||
{
|
||||
get
|
||||
{
|
||||
float result;
|
||||
Marshal.ThrowExceptionForHR(_AudioMeterInformation.GetPeakValue(out result));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioMeterInformationChannels
|
||||
{
|
||||
IAudioMeterInformation _AudioMeterInformation;
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
int result;
|
||||
Marshal.ThrowExceptionForHR(_AudioMeterInformation.GetMeteringChannelCount(out result));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public float this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
float[] peakValues = new float[Count];
|
||||
GCHandle Params = GCHandle.Alloc(peakValues, GCHandleType.Pinned);
|
||||
Marshal.ThrowExceptionForHR(_AudioMeterInformation.GetChannelsPeakValues(peakValues.Length, Params.AddrOfPinnedObject()));
|
||||
Params.Free();
|
||||
return peakValues[index];
|
||||
}
|
||||
}
|
||||
|
||||
internal AudioMeterInformationChannels(IAudioMeterInformation parent)
|
||||
{
|
||||
_AudioMeterInformation = parent;
|
||||
}
|
||||
}
|
||||
}
|
155
AppleWirelessKeyboard/CoreAudioAPI/AudioSessionControl.cs
Normal file
155
AppleWirelessKeyboard/CoreAudioAPI/AudioSessionControl.cs
Normal file
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioSessionControl
|
||||
{
|
||||
internal IAudioSessionControl2 _AudioSessionControl;
|
||||
internal AudioMeterInformation _AudioMeterInformation;
|
||||
internal SimpleAudioVolume _SimpleAudioVolume;
|
||||
|
||||
public AudioMeterInformation AudioMeterInformation
|
||||
{
|
||||
get
|
||||
{
|
||||
return _AudioMeterInformation;
|
||||
}
|
||||
}
|
||||
|
||||
public SimpleAudioVolume SimpleAudioVolume
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SimpleAudioVolume;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
|
||||
{
|
||||
IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
|
||||
ISimpleAudioVolume _volume = realAudioSessionControl as ISimpleAudioVolume;
|
||||
if (_meters != null)
|
||||
_AudioMeterInformation = new CoreAudioApi.AudioMeterInformation(_meters);
|
||||
if (_volume != null)
|
||||
_SimpleAudioVolume = new SimpleAudioVolume(_volume);
|
||||
_AudioSessionControl = realAudioSessionControl;
|
||||
|
||||
}
|
||||
|
||||
public void RegisterAudioSessionNotification(IAudioSessionEvents eventConsumer)
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.RegisterAudioSessionNotification(eventConsumer));
|
||||
}
|
||||
|
||||
public void UnregisterAudioSessionNotification(IAudioSessionEvents eventConsumer)
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.UnregisterAudioSessionNotification(eventConsumer));
|
||||
}
|
||||
|
||||
public AudioSessionState State
|
||||
{
|
||||
get
|
||||
{
|
||||
AudioSessionState res;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.GetState(out res));
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public string DisplayName
|
||||
{
|
||||
get
|
||||
{
|
||||
IntPtr NamePtr;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.GetDisplayName(out NamePtr));
|
||||
string res = Marshal.PtrToStringAuto(NamePtr);
|
||||
Marshal.FreeCoTaskMem(NamePtr);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public string IconPath
|
||||
{
|
||||
get
|
||||
{
|
||||
IntPtr NamePtr;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.GetIconPath(out NamePtr));
|
||||
string res = Marshal.PtrToStringAuto(NamePtr);
|
||||
Marshal.FreeCoTaskMem(NamePtr);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public string SessionIdentifier
|
||||
{
|
||||
get
|
||||
{
|
||||
IntPtr NamePtr;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.GetSessionIdentifier(out NamePtr));
|
||||
string res = Marshal.PtrToStringAuto(NamePtr);
|
||||
Marshal.FreeCoTaskMem(NamePtr);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public string SessionInstanceIdentifier
|
||||
{
|
||||
get
|
||||
{
|
||||
IntPtr NamePtr;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.GetSessionInstanceIdentifier(out NamePtr));
|
||||
string res = Marshal.PtrToStringAuto(NamePtr);
|
||||
Marshal.FreeCoTaskMem(NamePtr);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public uint ProcessID
|
||||
{
|
||||
get
|
||||
{
|
||||
uint pid;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionControl.GetProcessId(out pid));
|
||||
return pid;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSystemIsSystemSoundsSession
|
||||
{
|
||||
get
|
||||
{
|
||||
return (_AudioSessionControl.IsSystemSoundsSession() == 0); //S_OK
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public enum AudioSessionDisconnectReason
|
||||
{
|
||||
DisconnectReasonDeviceRemoval = 0,
|
||||
DisconnectReasonServerShutdown = (DisconnectReasonDeviceRemoval + 1),
|
||||
DisconnectReasonFormatChanged = (DisconnectReasonServerShutdown + 1),
|
||||
DisconnectReasonSessionLogoff = (DisconnectReasonFormatChanged + 1),
|
||||
DisconnectReasonSessionDisconnected = (DisconnectReasonSessionLogoff + 1),
|
||||
DisconnectReasonExclusiveModeOverride = (DisconnectReasonSessionDisconnected + 1)
|
||||
}
|
||||
}
|
54
AppleWirelessKeyboard/CoreAudioAPI/AudioSessionManager.cs
Normal file
54
AppleWirelessKeyboard/CoreAudioAPI/AudioSessionManager.cs
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioSessionManager
|
||||
{
|
||||
private IAudioSessionManager2 _AudioSessionManager;
|
||||
private SessionCollection _Sessions;
|
||||
|
||||
internal AudioSessionManager(IAudioSessionManager2 realAudioSessionManager)
|
||||
{
|
||||
_AudioSessionManager = realAudioSessionManager;
|
||||
IAudioSessionEnumerator _SessionEnum ;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionManager.GetSessionEnumerator(out _SessionEnum));
|
||||
_Sessions = new SessionCollection(_SessionEnum);
|
||||
}
|
||||
|
||||
public SessionCollection Sessions
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Sessions;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
35
AppleWirelessKeyboard/CoreAudioAPI/AudioSessionState.cs
Normal file
35
AppleWirelessKeyboard/CoreAudioAPI/AudioSessionState.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public enum AudioSessionState
|
||||
{
|
||||
AudioSessionStateInactive = 0,
|
||||
AudioSessionStateActive = 1,
|
||||
AudioSessionStateExpired = 2
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class AudioVolumeNotificationData
|
||||
{
|
||||
private Guid _EventContext;
|
||||
private bool _Muted;
|
||||
private float _MasterVolume;
|
||||
private int _Channels;
|
||||
private float[] _ChannelVolume;
|
||||
|
||||
public Guid EventContext
|
||||
{
|
||||
get
|
||||
{
|
||||
return _EventContext;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Muted
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Muted;
|
||||
}
|
||||
}
|
||||
|
||||
public float MasterVolume
|
||||
{
|
||||
get
|
||||
{
|
||||
return _MasterVolume;
|
||||
}
|
||||
}
|
||||
public int Channels
|
||||
{
|
||||
get
|
||||
{
|
||||
return _Channels;
|
||||
}
|
||||
}
|
||||
|
||||
public float[] ChannelVolume
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ChannelVolume;
|
||||
}
|
||||
}
|
||||
public AudioVolumeNotificationData(Guid eventContext, bool muted, float masterVolume, float[] channelVolume)
|
||||
{
|
||||
_EventContext = eventContext;
|
||||
_Muted = muted;
|
||||
_MasterVolume = masterVolume;
|
||||
_Channels = channelVolume.Length;
|
||||
_ChannelVolume = channelVolume;
|
||||
}
|
||||
}
|
||||
}
|
47
AppleWirelessKeyboard/CoreAudioAPI/Blob.cs
Normal file
47
AppleWirelessKeyboard/CoreAudioAPI/Blob.cs
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
internal struct Blob
|
||||
{
|
||||
public int Length;
|
||||
public IntPtr Data;
|
||||
|
||||
//Code Should Compile at warning level4 without any warnings,
|
||||
//However this struct will give us Warning CS0649: Field [Fieldname]
|
||||
//is never assigned to, and will always have its default value
|
||||
//You can disable CS0649 in the project options but that will disable
|
||||
//the warning for the whole project, it's a nice warning and we do want
|
||||
//it in other places so we make a nice dummy function to keep the compiler
|
||||
//happy.
|
||||
private void FixCS0649()
|
||||
{
|
||||
Length = 0;
|
||||
Data = IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
}
|
53
AppleWirelessKeyboard/CoreAudioAPI/CLSCTX.cs
Normal file
53
AppleWirelessKeyboard/CoreAudioAPI/CLSCTX.cs
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Flags]
|
||||
internal enum CLSCTX : uint
|
||||
{
|
||||
INPROC_SERVER = 0x1,
|
||||
INPROC_HANDLER = 0x2,
|
||||
LOCAL_SERVER = 0x4,
|
||||
INPROC_SERVER16 = 0x8,
|
||||
REMOTE_SERVER = 0x10,
|
||||
INPROC_HANDLER16 = 0x20,
|
||||
RESERVED1 = 0x40,
|
||||
RESERVED2 = 0x80,
|
||||
RESERVED3 = 0x100,
|
||||
RESERVED4 = 0x200,
|
||||
NO_CODE_DOWNLOAD = 0x400,
|
||||
RESERVED5 = 0x800,
|
||||
NO_CUSTOM_MARSHAL = 0x1000,
|
||||
ENABLE_CODE_DOWNLOAD = 0x2000,
|
||||
NO_FAILURE_LOG = 0x4000,
|
||||
DISABLE_AAA = 0x8000,
|
||||
ENABLE_AAA = 0x10000,
|
||||
FROM_DEFAULT_CONTEXT = 0x20000,
|
||||
INPROC = INPROC_SERVER | INPROC_HANDLER,
|
||||
SERVER = INPROC_SERVER | LOCAL_SERVER | REMOTE_SERVER,
|
||||
ALL = SERVER | INPROC_HANDLER
|
||||
}
|
||||
}
|
35
AppleWirelessKeyboard/CoreAudioAPI/EDataFlow.cs
Normal file
35
AppleWirelessKeyboard/CoreAudioAPI/EDataFlow.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public enum EDataFlow
|
||||
{
|
||||
eRender = 0,
|
||||
eCapture = 1,
|
||||
eAll = 2 ,
|
||||
EDataFlow_enum_count =3
|
||||
}
|
||||
}
|
36
AppleWirelessKeyboard/CoreAudioAPI/EDeviceState.cs
Normal file
36
AppleWirelessKeyboard/CoreAudioAPI/EDeviceState.cs
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
[Flags]
|
||||
public enum EDeviceState : uint
|
||||
{
|
||||
DEVICE_STATE_ACTIVE = 0x00000001,
|
||||
DEVICE_STATE_UNPLUGGED = 0x00000002,
|
||||
DEVICE_STATE_NOTPRESENT = 0x00000004,
|
||||
DEVICE_STATEMASK_ALL = 0x00000007
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
[Flags]
|
||||
public enum EEndpointHardwareSupport
|
||||
{
|
||||
Volume = 0x00000001,
|
||||
Mute = 0x00000002,
|
||||
Meter = 0x00000004
|
||||
}
|
||||
}
|
35
AppleWirelessKeyboard/CoreAudioAPI/ERole.cs
Normal file
35
AppleWirelessKeyboard/CoreAudioAPI/ERole.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public enum ERole
|
||||
{
|
||||
eConsole =0,
|
||||
eMultimedia =1,
|
||||
eCommunications=2,
|
||||
ERole_enum_count=3
|
||||
}
|
||||
}
|
70
AppleWirelessKeyboard/CoreAudioAPI/IAudioEndpointVolume.cs
Normal file
70
AppleWirelessKeyboard/CoreAudioAPI/IAudioEndpointVolume.cs
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IAudioEndpointVolume
|
||||
{
|
||||
[PreserveSig]
|
||||
int RegisterControlChangeNotify(IAudioEndpointVolumeCallback pNotify);
|
||||
[PreserveSig]
|
||||
int UnregisterControlChangeNotify(IAudioEndpointVolumeCallback pNotify);
|
||||
[PreserveSig]
|
||||
int GetChannelCount(out int pnChannelCount);
|
||||
[PreserveSig]
|
||||
int SetMasterVolumeLevel(float fLevelDB, Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int SetMasterVolumeLevelScalar(float fLevel, Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int GetMasterVolumeLevel(out float pfLevelDB);
|
||||
[PreserveSig]
|
||||
int GetMasterVolumeLevelScalar(out float pfLevel);
|
||||
[PreserveSig]
|
||||
int SetChannelVolumeLevel(uint nChannel, float fLevelDB, Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int SetChannelVolumeLevelScalar(uint nChannel, float fLevel, Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int GetChannelVolumeLevel(uint nChannel, out float pfLevelDB);
|
||||
[PreserveSig]
|
||||
int GetChannelVolumeLevelScalar(uint nChannel, out float pfLevel);
|
||||
[PreserveSig]
|
||||
int SetMute([MarshalAs(UnmanagedType.Bool)] Boolean bMute, Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int GetMute(out bool pbMute);
|
||||
[PreserveSig]
|
||||
int GetVolumeStepInfo(out uint pnStep, out uint pnStepCount);
|
||||
[PreserveSig]
|
||||
int VolumeStepUp(Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int VolumeStepDown(Guid pguidEventContext);
|
||||
[PreserveSig]
|
||||
int QueryHardwareSupport(out uint pdwHardwareSupportMask);
|
||||
[PreserveSig]
|
||||
int GetVolumeRange(out float pflVolumeMindB, out float pflVolumeMaxdB, out float pflVolumeIncrementdB);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("657804FA-D6AD-4496-8A60-352752AF4F89"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IAudioEndpointVolumeCallback
|
||||
{
|
||||
[PreserveSig] int OnNotify(IntPtr pNotifyData);
|
||||
};
|
||||
|
||||
}
|
42
AppleWirelessKeyboard/CoreAudioAPI/IAudioMeterInformation.cs
Normal file
42
AppleWirelessKeyboard/CoreAudioAPI/IAudioMeterInformation.cs
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("C02216F6-8C67-4B5B-9D00-D008E73E0064"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IAudioMeterInformation
|
||||
{
|
||||
[PreserveSig]
|
||||
int GetPeakValue(out float pfPeak);
|
||||
[PreserveSig]
|
||||
int GetMeteringChannelCount(out int pnChannelCount);
|
||||
[PreserveSig]
|
||||
int GetChannelsPeakValues( int u32ChannelCount,[In] IntPtr afPeakValues);
|
||||
[PreserveSig]
|
||||
int QueryHardwareSupport( out int pdwHardwareSupportMask);
|
||||
};
|
||||
}
|
37
AppleWirelessKeyboard/CoreAudioAPI/IAudioPeakMeter.cs
Normal file
37
AppleWirelessKeyboard/CoreAudioAPI/IAudioPeakMeter.cs
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("DD79923C-0599-45e0-B8B6-C8DF7DB6E796"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IAudioPeakMeter
|
||||
{
|
||||
int GetChannelCount( out int pcChannels);
|
||||
int GetLevel( int Channel, out float level);
|
||||
}
|
||||
}
|
66
AppleWirelessKeyboard/CoreAudioAPI/IAudioSessionControl2.cs
Normal file
66
AppleWirelessKeyboard/CoreAudioAPI/IAudioSessionControl2.cs
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
interface IAudioSessionControl2
|
||||
{
|
||||
//IAudioSession functions
|
||||
[PreserveSig]
|
||||
int GetState(out AudioSessionState state);
|
||||
[PreserveSig]
|
||||
int GetDisplayName(out IntPtr name);
|
||||
[PreserveSig]
|
||||
int SetDisplayName(string value, Guid EventContext);
|
||||
[PreserveSig]
|
||||
int GetIconPath(out IntPtr Path);
|
||||
[PreserveSig]
|
||||
int SetIconPath(string Value, Guid EventContext);
|
||||
[PreserveSig]
|
||||
int GetGroupingParam(out Guid GroupingParam);
|
||||
[PreserveSig]
|
||||
int SetGroupingParam(Guid Override, Guid Eventcontext);
|
||||
[PreserveSig]
|
||||
int RegisterAudioSessionNotification(IAudioSessionEvents NewNotifications);
|
||||
[PreserveSig]
|
||||
int UnregisterAudioSessionNotification(IAudioSessionEvents NewNotifications);
|
||||
//IAudioSession2 functions
|
||||
[PreserveSig]
|
||||
int GetSessionIdentifier( out IntPtr retVal);
|
||||
[PreserveSig]
|
||||
int GetSessionInstanceIdentifier( out IntPtr retVal);
|
||||
[PreserveSig]
|
||||
int GetProcessId( out UInt32 retvVal);
|
||||
[PreserveSig]
|
||||
int IsSystemSoundsSession();
|
||||
[PreserveSig]
|
||||
int SetDuckingPreference( bool optOut);
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IAudioSessionEnumerator
|
||||
{
|
||||
int GetCount( out int SessionCount);
|
||||
int GetSession( int SessionCount,out IAudioSessionControl2 Session );
|
||||
}
|
||||
}
|
48
AppleWirelessKeyboard/CoreAudioAPI/IAudioSessionEvents.cs
Normal file
48
AppleWirelessKeyboard/CoreAudioAPI/IAudioSessionEvents.cs
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("24918ACC-64B3-37C1-8CA9-74A66E9957A8"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
public interface IAudioSessionEvents
|
||||
{
|
||||
[PreserveSig]
|
||||
int OnDisplayNameChanged( [MarshalAs(UnmanagedType.LPWStr)] string NewDisplayName, Guid EventContext );
|
||||
[PreserveSig]
|
||||
int OnIconPathChanged( [MarshalAs(UnmanagedType.LPWStr)] string NewIconPath, Guid EventContext );
|
||||
[PreserveSig]
|
||||
int OnSimpleVolumeChanged( float NewVolume,bool newMute, Guid EventContext );
|
||||
[PreserveSig]
|
||||
int OnChannelVolumeChanged( UInt32 ChannelCount, IntPtr NewChannelVolumeArray, UInt32 ChangedChannel, Guid EventContext );
|
||||
[PreserveSig]
|
||||
int OnGroupingParamChanged( Guid NewGroupingParam, Guid EventContext );
|
||||
[PreserveSig]
|
||||
int OnStateChanged( AudioSessionState NewState);
|
||||
[PreserveSig]
|
||||
int OnSessionDisconnected( AudioSessionDisconnectReason DisconnectReason);
|
||||
}
|
||||
}
|
49
AppleWirelessKeyboard/CoreAudioAPI/IAudioSessionManager2.cs
Normal file
49
AppleWirelessKeyboard/CoreAudioAPI/IAudioSessionManager2.cs
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
interface IAudioSessionManager2
|
||||
{
|
||||
[PreserveSig]
|
||||
int GetAudioSessionControl(ref Guid AudioSessionGuid, UInt32 StreamFlags, IntPtr ISessionControl );
|
||||
[PreserveSig]
|
||||
int GetSimpleAudioVolume(ref Guid AudioSessionGuid, UInt32 StreamFlags, IntPtr /*ISimpleAudioVolume*/ SimpleAudioVolume);
|
||||
[PreserveSig]
|
||||
int GetSessionEnumerator(out IAudioSessionEnumerator SessionEnum);
|
||||
[PreserveSig]
|
||||
int RegisterSessionNotification( IntPtr IAudioSessionNotification );
|
||||
[PreserveSig]
|
||||
int UnregisterSessionNotification( IntPtr IAudioSessionNotification );
|
||||
[PreserveSig]
|
||||
int RegisterDuckNotification( string sessionID, IntPtr IAudioVolumeDuckNotification);
|
||||
[PreserveSig]
|
||||
int UnregisterDuckNotification(IntPtr IAudioVolumeDuckNotification);
|
||||
};
|
||||
}
|
42
AppleWirelessKeyboard/CoreAudioAPI/IMMDevice.cs
Normal file
42
AppleWirelessKeyboard/CoreAudioAPI/IMMDevice.cs
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("D666063F-1587-4E43-81F1-B948E807363F"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IMMDevice
|
||||
{
|
||||
[PreserveSig]
|
||||
int Activate(ref Guid iid, CLSCTX dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface);
|
||||
[PreserveSig]
|
||||
int OpenPropertyStore(EStgmAccess stgmAccess, out IPropertyStore propertyStore);
|
||||
[PreserveSig]
|
||||
int GetId([MarshalAs(UnmanagedType.LPWStr)] out string ppstrId);
|
||||
[PreserveSig]
|
||||
int GetState(out EDeviceState pdwState);
|
||||
}
|
||||
}
|
38
AppleWirelessKeyboard/CoreAudioAPI/IMMDeviceCollection.cs
Normal file
38
AppleWirelessKeyboard/CoreAudioAPI/IMMDeviceCollection.cs
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("0BD7A1BE-7A1A-44DB-8397-CC5392387B5E"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IMMDeviceCollection
|
||||
{
|
||||
[PreserveSig]
|
||||
int GetCount(out uint pcDevices);
|
||||
[PreserveSig]
|
||||
int Item(uint nDevice, out IMMDevice Device);
|
||||
}
|
||||
}
|
44
AppleWirelessKeyboard/CoreAudioAPI/IMMDeviceEnumerator.cs
Normal file
44
AppleWirelessKeyboard/CoreAudioAPI/IMMDeviceEnumerator.cs
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IMMDeviceEnumerator
|
||||
{
|
||||
[PreserveSig]
|
||||
int EnumAudioEndpoints(EDataFlow dataFlow, EDeviceState StateMask, out IMMDeviceCollection device);
|
||||
[PreserveSig]
|
||||
int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice ppEndpoint);
|
||||
[PreserveSig]
|
||||
int GetDevice(string pwstrId, out IMMDevice ppDevice);
|
||||
[PreserveSig]
|
||||
int RegisterEndpointNotificationCallback(IntPtr pClient);
|
||||
[PreserveSig]
|
||||
int UnregisterEndpointNotificationCallback(IntPtr pClient);
|
||||
}
|
||||
}
|
36
AppleWirelessKeyboard/CoreAudioAPI/IMMEndpoint.cs
Normal file
36
AppleWirelessKeyboard/CoreAudioAPI/IMMEndpoint.cs
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("1BE09788-6894-4089-8586-9A2A6C265AC5"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IMMEndpoint
|
||||
{
|
||||
[PreserveSig]
|
||||
int GetDataFlow(out EDataFlow pDataFlow);
|
||||
};
|
||||
}
|
44
AppleWirelessKeyboard/CoreAudioAPI/IPropertyStore.cs
Normal file
44
AppleWirelessKeyboard/CoreAudioAPI/IPropertyStore.cs
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface IPropertyStore
|
||||
{
|
||||
[PreserveSig]
|
||||
int GetCount( out Int32 count);
|
||||
[PreserveSig]
|
||||
int GetAt( int iProp, out PropertyKey pkey);
|
||||
[PreserveSig]
|
||||
int GetValue(ref PropertyKey key, out PropVariant pv);
|
||||
[PreserveSig]
|
||||
int SetValue(ref PropertyKey key, ref PropVariant propvar);
|
||||
[PreserveSig]
|
||||
int Commit( );
|
||||
};
|
||||
}
|
43
AppleWirelessKeyboard/CoreAudioAPI/ISimpleAudioVolume.cs
Normal file
43
AppleWirelessKeyboard/CoreAudioAPI/ISimpleAudioVolume.cs
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
[Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
||||
internal interface ISimpleAudioVolume
|
||||
{
|
||||
[PreserveSig]
|
||||
int SetMasterVolume( float fLevel,ref Guid EventContext);
|
||||
[PreserveSig]
|
||||
int GetMasterVolume( out float pfLevel);
|
||||
[PreserveSig]
|
||||
int SetMute( bool bMute, ref Guid EventContext) ;
|
||||
[PreserveSig]
|
||||
int GetMute( out bool bMute);
|
||||
}
|
||||
}
|
180
AppleWirelessKeyboard/CoreAudioAPI/MMDevice.cs
Normal file
180
AppleWirelessKeyboard/CoreAudioAPI/MMDevice.cs
Normal file
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class MMDevice
|
||||
{
|
||||
#region Variables
|
||||
private IMMDevice _RealDevice;
|
||||
private PropertyStore _PropertyStore;
|
||||
private AudioMeterInformation _AudioMeterInformation;
|
||||
private AudioEndpointVolume _AudioEndpointVolume;
|
||||
private AudioSessionManager _AudioSessionManager;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Guids
|
||||
private static Guid IID_IAudioMeterInformation = typeof(IAudioMeterInformation).GUID;
|
||||
private static Guid IID_IAudioEndpointVolume = typeof(IAudioEndpointVolume).GUID;
|
||||
private static Guid IID_IAudioSessionManager = typeof(IAudioSessionManager2).GUID;
|
||||
#endregion
|
||||
|
||||
#region Init
|
||||
private void GetPropertyInformation()
|
||||
{
|
||||
IPropertyStore propstore;
|
||||
Marshal.ThrowExceptionForHR(_RealDevice.OpenPropertyStore(EStgmAccess.STGM_READ, out propstore));
|
||||
_PropertyStore = new PropertyStore(propstore);
|
||||
}
|
||||
|
||||
private void GetAudioSessionManager()
|
||||
{
|
||||
object result;
|
||||
Marshal.ThrowExceptionForHR(_RealDevice.Activate(ref IID_IAudioSessionManager, CLSCTX.ALL, IntPtr.Zero, out result));
|
||||
_AudioSessionManager = new AudioSessionManager(result as IAudioSessionManager2);
|
||||
}
|
||||
|
||||
private void GetAudioMeterInformation()
|
||||
{
|
||||
object result;
|
||||
Marshal.ThrowExceptionForHR( _RealDevice.Activate(ref IID_IAudioMeterInformation, CLSCTX.ALL, IntPtr.Zero, out result));
|
||||
_AudioMeterInformation = new AudioMeterInformation( result as IAudioMeterInformation);
|
||||
}
|
||||
|
||||
private void GetAudioEndpointVolume()
|
||||
{
|
||||
object result;
|
||||
Marshal.ThrowExceptionForHR(_RealDevice.Activate(ref IID_IAudioEndpointVolume, CLSCTX.ALL, IntPtr.Zero, out result));
|
||||
_AudioEndpointVolume = new AudioEndpointVolume(result as IAudioEndpointVolume);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
public AudioSessionManager AudioSessionManager
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_AudioSessionManager == null)
|
||||
GetAudioSessionManager();
|
||||
|
||||
return _AudioSessionManager;
|
||||
}
|
||||
}
|
||||
|
||||
public AudioMeterInformation AudioMeterInformation
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_AudioMeterInformation == null)
|
||||
GetAudioMeterInformation();
|
||||
|
||||
return _AudioMeterInformation;
|
||||
}
|
||||
}
|
||||
|
||||
public AudioEndpointVolume AudioEndpointVolume
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_AudioEndpointVolume == null)
|
||||
GetAudioEndpointVolume();
|
||||
|
||||
return _AudioEndpointVolume;
|
||||
}
|
||||
}
|
||||
|
||||
public PropertyStore Properties
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_PropertyStore == null)
|
||||
GetPropertyInformation();
|
||||
return _PropertyStore;
|
||||
}
|
||||
}
|
||||
|
||||
public string FriendlyName
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_PropertyStore == null)
|
||||
GetPropertyInformation();
|
||||
if (_PropertyStore.Contains(PKEY.PKEY_DeviceInterface_FriendlyName))
|
||||
{
|
||||
return (string)_PropertyStore[PKEY.PKEY_DeviceInterface_FriendlyName].Value;
|
||||
}
|
||||
else
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public string ID
|
||||
{
|
||||
get
|
||||
{
|
||||
string Result;
|
||||
Marshal.ThrowExceptionForHR(_RealDevice.GetId(out Result));
|
||||
return Result;
|
||||
}
|
||||
}
|
||||
|
||||
public EDataFlow DataFlow
|
||||
{
|
||||
get
|
||||
{
|
||||
EDataFlow Result;
|
||||
IMMEndpoint ep = _RealDevice as IMMEndpoint ;
|
||||
ep.GetDataFlow(out Result);
|
||||
return Result;
|
||||
}
|
||||
}
|
||||
|
||||
public EDeviceState State
|
||||
{
|
||||
get
|
||||
{
|
||||
EDeviceState Result;
|
||||
Marshal.ThrowExceptionForHR(_RealDevice.GetState(out Result));
|
||||
return Result;
|
||||
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
internal MMDevice(IMMDevice realDevice)
|
||||
{
|
||||
_RealDevice = realDevice;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
59
AppleWirelessKeyboard/CoreAudioAPI/MMDeviceCollection.cs
Normal file
59
AppleWirelessKeyboard/CoreAudioAPI/MMDeviceCollection.cs
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using CoreAudioApi.Interfaces;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class MMDeviceCollection
|
||||
{
|
||||
private IMMDeviceCollection _MMDeviceCollection;
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
uint result;
|
||||
Marshal.ThrowExceptionForHR(_MMDeviceCollection.GetCount(out result));
|
||||
return (int)result;
|
||||
}
|
||||
}
|
||||
|
||||
public MMDevice this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
IMMDevice result;
|
||||
_MMDeviceCollection.Item((uint)index, out result);
|
||||
return new MMDevice(result);
|
||||
}
|
||||
}
|
||||
|
||||
internal MMDeviceCollection(IMMDeviceCollection parent)
|
||||
{
|
||||
_MMDeviceCollection = parent;
|
||||
}
|
||||
}
|
||||
}
|
70
AppleWirelessKeyboard/CoreAudioAPI/MMDeviceEnumerator.cs
Normal file
70
AppleWirelessKeyboard/CoreAudioAPI/MMDeviceEnumerator.cs
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using CoreAudioApi.Interfaces;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
//Marked as internal, since on its own its no good
|
||||
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
|
||||
internal class _MMDeviceEnumerator
|
||||
{
|
||||
}
|
||||
|
||||
//Small wrapper class
|
||||
public class MMDeviceEnumerator
|
||||
{
|
||||
private IMMDeviceEnumerator _realEnumerator = new _MMDeviceEnumerator() as IMMDeviceEnumerator;
|
||||
|
||||
public MMDeviceCollection EnumerateAudioEndPoints(EDataFlow dataFlow, EDeviceState dwStateMask)
|
||||
{
|
||||
IMMDeviceCollection result;
|
||||
Marshal.ThrowExceptionForHR(_realEnumerator.EnumAudioEndpoints(dataFlow,dwStateMask,out result));
|
||||
return new MMDeviceCollection(result);
|
||||
}
|
||||
|
||||
public MMDevice GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role)
|
||||
{
|
||||
IMMDevice _Device = null;
|
||||
Marshal.ThrowExceptionForHR(((IMMDeviceEnumerator)_realEnumerator).GetDefaultAudioEndpoint(dataFlow, role, out _Device));
|
||||
return new MMDevice(_Device);
|
||||
}
|
||||
|
||||
public MMDevice GetDevice(string ID)
|
||||
{
|
||||
IMMDevice _Device = null;
|
||||
Marshal.ThrowExceptionForHR(((IMMDeviceEnumerator)_realEnumerator).GetDevice(ID, out _Device));
|
||||
return new MMDevice(_Device);
|
||||
}
|
||||
|
||||
public MMDeviceEnumerator()
|
||||
{
|
||||
if (System.Environment.OSVersion.Version.Major < 6)
|
||||
{
|
||||
throw new NotSupportedException("This functionality is only supported on Windows Vista or newer.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
41
AppleWirelessKeyboard/CoreAudioAPI/PKEY.cs
Normal file
41
AppleWirelessKeyboard/CoreAudioAPI/PKEY.cs
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public static class PKEY
|
||||
{
|
||||
public static readonly Guid PKEY_DeviceInterface_FriendlyName = new Guid( 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0);
|
||||
public static readonly Guid PKEY_AudioEndpoint_FormFactor = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEndpoint_ControlPanelPageProvider = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEndpoint_Association = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEndpoint_PhysicalSpeakers = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEndpoint_GUID = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEndpoint_Disable_SysFx = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEndpoint_FullRangeSpeakers = new Guid( 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x0e);
|
||||
public static readonly Guid PKEY_AudioEngine_DeviceFormat = new Guid(0xf19f064d, 0x82c, 0x4e27, 0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c);
|
||||
|
||||
}
|
||||
}
|
96
AppleWirelessKeyboard/CoreAudioAPI/PropVariant.cs
Normal file
96
AppleWirelessKeyboard/CoreAudioAPI/PropVariant.cs
Normal file
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices.ComTypes;
|
||||
using System.Runtime.InteropServices;
|
||||
using CoreAudioApi.Interfaces;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
public struct PropVariant
|
||||
{
|
||||
[FieldOffset(0)] short vt;
|
||||
[FieldOffset(2)] short wReserved1;
|
||||
[FieldOffset(4)] short wReserved2;
|
||||
[FieldOffset(6)] short wReserved3;
|
||||
[FieldOffset(8)] sbyte cVal;
|
||||
[FieldOffset(8)] byte bVal;
|
||||
[FieldOffset(8)] short iVal;
|
||||
[FieldOffset(8)] ushort uiVal;
|
||||
[FieldOffset(8)] int lVal;
|
||||
[FieldOffset(8)] uint ulVal;
|
||||
[FieldOffset(8)] long hVal;
|
||||
[FieldOffset(8)] ulong uhVal;
|
||||
[FieldOffset(8)] float fltVal;
|
||||
[FieldOffset(8)] double dblVal;
|
||||
[FieldOffset(8)] Blob blobVal;
|
||||
[FieldOffset(8)] DateTime date;
|
||||
[FieldOffset(8)] bool boolVal;
|
||||
[FieldOffset(8)] int scode;
|
||||
[FieldOffset(8)] System.Runtime.InteropServices.ComTypes.FILETIME filetime;
|
||||
[FieldOffset(8)] IntPtr everything_else;
|
||||
|
||||
//I'm sure there is a more efficient way to do this but this works ..for now..
|
||||
internal byte[] GetBlob()
|
||||
{
|
||||
byte[] Result = new byte[blobVal.Length];
|
||||
for (int i = 0; i < blobVal.Length; i++)
|
||||
{
|
||||
Result[i] = Marshal.ReadByte((IntPtr) ((long)(blobVal.Data) + i));
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
public object Value
|
||||
{
|
||||
get
|
||||
{
|
||||
VarEnum ve = (VarEnum)vt;
|
||||
switch (ve)
|
||||
{
|
||||
case VarEnum.VT_I1:
|
||||
return bVal;
|
||||
case VarEnum.VT_I2:
|
||||
return iVal;
|
||||
case VarEnum.VT_I4:
|
||||
return lVal;
|
||||
case VarEnum.VT_I8:
|
||||
return hVal;
|
||||
case VarEnum.VT_INT:
|
||||
return iVal;
|
||||
case VarEnum.VT_UI4:
|
||||
return ulVal;
|
||||
case VarEnum.VT_LPWSTR:
|
||||
return Marshal.PtrToStringUni(everything_else);
|
||||
case VarEnum.VT_BLOB:
|
||||
return GetBlob();
|
||||
}
|
||||
return "FIXME Type = " + ve.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
34
AppleWirelessKeyboard/CoreAudioAPI/PropertyKey.cs
Normal file
34
AppleWirelessKeyboard/CoreAudioAPI/PropertyKey.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public struct PropertyKey
|
||||
{
|
||||
public Guid fmtid;
|
||||
public int pid;
|
||||
};
|
||||
|
||||
}
|
107
AppleWirelessKeyboard/CoreAudioAPI/PropertyStore.cs
Normal file
107
AppleWirelessKeyboard/CoreAudioAPI/PropertyStore.cs
Normal file
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
/// <summary>
|
||||
/// Property Store class, only supports reading properties at the moment.
|
||||
/// </summary>
|
||||
public class PropertyStore
|
||||
{
|
||||
private IPropertyStore _Store;
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
int Result;
|
||||
Marshal.ThrowExceptionForHR(_Store.GetCount(out Result));
|
||||
return Result;
|
||||
}
|
||||
}
|
||||
|
||||
public PropertyStoreProperty this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
PropVariant result;
|
||||
PropertyKey key = Get(index);
|
||||
Marshal.ThrowExceptionForHR(_Store.GetValue(ref key, out result));
|
||||
return new PropertyStoreProperty(key, result);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Contains(Guid guid)
|
||||
{
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
PropertyKey key = Get(i);
|
||||
if (key.fmtid == guid)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public PropertyStoreProperty this[Guid guid]
|
||||
{
|
||||
get
|
||||
{
|
||||
PropVariant result;
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
PropertyKey key = Get(i);
|
||||
if (key.fmtid == guid)
|
||||
{
|
||||
Marshal.ThrowExceptionForHR(_Store.GetValue(ref key, out result));
|
||||
return new PropertyStoreProperty(key, result);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public PropertyKey Get(int index)
|
||||
{
|
||||
PropertyKey key;
|
||||
Marshal.ThrowExceptionForHR( _Store.GetAt(index, out key));
|
||||
return key;
|
||||
}
|
||||
|
||||
public PropVariant GetValue(int index)
|
||||
{
|
||||
PropVariant result;
|
||||
PropertyKey key = Get(index);
|
||||
Marshal.ThrowExceptionForHR(_Store.GetValue(ref key, out result));
|
||||
return result;
|
||||
}
|
||||
|
||||
internal PropertyStore(IPropertyStore store)
|
||||
{
|
||||
_Store = store;
|
||||
}
|
||||
}
|
||||
}
|
57
AppleWirelessKeyboard/CoreAudioAPI/PropertyStoreProperty.cs
Normal file
57
AppleWirelessKeyboard/CoreAudioAPI/PropertyStoreProperty.cs
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class PropertyStoreProperty
|
||||
{
|
||||
private PropertyKey _PropertyKey;
|
||||
private PropVariant _PropValue;
|
||||
|
||||
internal PropertyStoreProperty(PropertyKey key, PropVariant value)
|
||||
{
|
||||
_PropertyKey = key;
|
||||
_PropValue = value;
|
||||
}
|
||||
|
||||
public PropertyKey Key
|
||||
{
|
||||
get
|
||||
{
|
||||
return _PropertyKey;
|
||||
}
|
||||
}
|
||||
|
||||
public object Value
|
||||
{
|
||||
get
|
||||
{
|
||||
return _PropValue.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
60
AppleWirelessKeyboard/CoreAudioAPI/SessionCollection.cs
Normal file
60
AppleWirelessKeyboard/CoreAudioAPI/SessionCollection.cs
Normal file
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class SessionCollection
|
||||
{
|
||||
IAudioSessionEnumerator _AudioSessionEnumerator;
|
||||
internal SessionCollection(IAudioSessionEnumerator realEnumerator)
|
||||
{
|
||||
_AudioSessionEnumerator = realEnumerator;
|
||||
}
|
||||
|
||||
public AudioSessionControl this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
IAudioSessionControl2 _Result;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionEnumerator.GetSession(index, out _Result));
|
||||
return new AudioSessionControl(_Result);
|
||||
}
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
int result;
|
||||
Marshal.ThrowExceptionForHR(_AudioSessionEnumerator.GetCount(out result));
|
||||
return (int)result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
70
AppleWirelessKeyboard/CoreAudioAPI/SimpleAudioVolume.cs
Normal file
70
AppleWirelessKeyboard/CoreAudioAPI/SimpleAudioVolume.cs
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using CoreAudioApi.Interfaces;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreAudioApi
|
||||
{
|
||||
public class SimpleAudioVolume
|
||||
{
|
||||
ISimpleAudioVolume _SimpleAudioVolume;
|
||||
internal SimpleAudioVolume(ISimpleAudioVolume realSimpleVolume)
|
||||
{
|
||||
_SimpleAudioVolume = realSimpleVolume;
|
||||
}
|
||||
|
||||
public float MasterVolume
|
||||
{
|
||||
get
|
||||
{
|
||||
float ret;
|
||||
Marshal.ThrowExceptionForHR(_SimpleAudioVolume.GetMasterVolume(out ret));
|
||||
return ret;
|
||||
}
|
||||
set
|
||||
{
|
||||
Guid Empty = Guid.Empty;
|
||||
Marshal.ThrowExceptionForHR(_SimpleAudioVolume.SetMasterVolume(value, ref Empty));
|
||||
}
|
||||
}
|
||||
|
||||
public bool Mute
|
||||
{
|
||||
get
|
||||
{
|
||||
bool ret;
|
||||
Marshal.ThrowExceptionForHR(_SimpleAudioVolume.GetMute(out ret));
|
||||
return ret;
|
||||
}
|
||||
set
|
||||
{
|
||||
Guid Empty = Guid.Empty;
|
||||
Marshal.ThrowExceptionForHR(_SimpleAudioVolume.SetMute(value, ref Empty));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
34
AppleWirelessKeyboard/CoreAudioAPI/eStgmAccess.cs
Normal file
34
AppleWirelessKeyboard/CoreAudioAPI/eStgmAccess.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
LICENSE
|
||||
-------
|
||||
Copyright (C) 2007-2010 Ray Molenkamp
|
||||
|
||||
This source code is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this source code or the software it produces.
|
||||
|
||||
Permission is granted to anyone to use this source code for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this source code must not be misrepresented; you must not
|
||||
claim that you wrote the original source code. If you use this source code
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original source code.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CoreAudioApi.Interfaces
|
||||
{
|
||||
internal enum EStgmAccess
|
||||
{
|
||||
STGM_READ = 0x00000000,
|
||||
STGM_WRITE = 0x00000001,
|
||||
STGM_READWRITE = 0x00000002
|
||||
}
|
||||
}
|
9
AppleWirelessKeyboard/Glyphs/Eject.xaml
Normal file
9
AppleWirelessKeyboard/Glyphs/Eject.xaml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.Eject"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Grid Width="100" Height="100">
|
||||
<Path Fill="White" Data="M 0,80 100,80 100,100 0,100 0,60 100,60 50,0 0,60 Z">
|
||||
|
||||
</Path>
|
||||
</Grid>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/Eject.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/Eject.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Eject.xaml
|
||||
/// </summary>
|
||||
public partial class Eject : UserControl
|
||||
{
|
||||
public Eject()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
13
AppleWirelessKeyboard/Glyphs/MuteOff.xaml
Normal file
13
AppleWirelessKeyboard/Glyphs/MuteOff.xaml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.MuteOff"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="163.855" Height="164.538" Margin="-1,0,0,-18">
|
||||
<Path Fill="White" Data=" M 152.604,162.214 C 148.539,158.148 148.629,158.238 142.618,152.226 C 101.379,110.987 58.768,68.376 16.633,26.242 C 12.132,21.740 8.224,17.176 2.714,11.667 C -4.192,4.761 3.292,-5.161 11.636,3.183 C 19.854,11.402 19.325,10.936 26.632,18.243 C 69.051,60.662 110.754,102.365 152.616,144.227 C 154.698,146.309 157.776,149.448 160.886,152.558 C 168.823,160.495 159.042,168.651 152.604,162.214 Z"/>
|
||||
<Path Fill="White" Data=" M 72.626,14.243 C 78.209,12.802 87.041,12.802 92.624,14.243 C 92.363,2.523 72.989,2.862 72.626,14.243 Z M 139.719,128.495 C 144.199,127.537 151.276,126.884 152.469,121.412 C 146.405,116.136 136.648,114.867 125.620,114.230 C 98.542,87.981 71.875,61.323 45.630,34.241 C 50.101,25.380 56.792,18.740 67.627,16.243 C 67.303,-1.437 96.603,-3.958 96.624,15.243 C 103.228,17.650 112.454,22.216 117.621,29.241 C 125.586,40.071 126.852,61.361 132.619,81.235 C 136.187,93.529 143.228,103.102 150.617,113.231 C 152.076,115.231 155.156,120.802 155.052,123.870 C 151.927,127.954 148.261,130.245 142.136,130.954 C 141.929,130.978 140.581,129.218 139.719,128.495 Z"/>
|
||||
<Path Fill="White" Data=" M 38.631,51.238 C 58.212,70.652 81.374,91.817 97.623,111.231 C 66.567,111.837 33.375,110.308 12.634,121.230 C 16.553,128.329 26.643,128.957 35.631,130.229 C 53.513,132.760 77.622,134.195 99.623,133.228 C 105.669,132.962 113.560,131.825 118.303,131.579 C 120.291,131.475 121.100,132.975 122.620,134.228 C 86.909,139.281 15.636,136.245 9.201,123.668 C 13.580,110.886 22.064,104.682 27.632,93.233 C 33.447,81.277 35.330,67.870 38.631,51.238 Z"/>
|
||||
<Path Fill="White" Data=" M 100.053,113.995 C 100.160,116.464 93.993,122.959 90.624,124.229 C 80.785,127.939 67.322,122.250 64.627,114.230 C 77.068,113.434 87.725,112.877 100.053,113.995 Z"/>
|
||||
<Canvas.LayoutTransform>
|
||||
<ScaleTransform ScaleX="0.7" ScaleY="0.7"/>
|
||||
</Canvas.LayoutTransform>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/MuteOff.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/MuteOff.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MuteOff.xaml
|
||||
/// </summary>
|
||||
public partial class MuteOff : UserControl
|
||||
{
|
||||
public MuteOff()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
11
AppleWirelessKeyboard/Glyphs/MuteOn.xaml
Normal file
11
AppleWirelessKeyboard/Glyphs/MuteOn.xaml
Normal file
|
@ -0,0 +1,11 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.MuteOn"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="147.463" Height="135.280">
|
||||
<Path Fill="White" Data=" M 54.993,110.208 C 35.873,111.317 16.495,111.064 4.000,119.207 C 7.177,126.871 18.307,126.976 26.997,128.206 C 55.356,132.220 93.980,132.028 120.985,128.206 C 130.092,126.917 139.963,126.250 143.982,119.207 C 122.687,108.571 86.501,108.381 54.993,110.208 Z M 63.992,12.220 C 69.575,10.779 78.406,10.779 83.989,12.220 C 83.729,0.500 64.355,0.839 63.992,12.220 Z M 147.463,122.667 C 138.546,134.917 101.529,134.546 73.991,135.205 C 60.249,135.534 45.733,134.763 32.996,133.205 C 20.070,131.625 6.654,130.173 0.000,122.207 C 2.986,111.388 10.176,108.109 15.998,98.209 C 33.394,68.630 24.135,21.592 58.993,14.220 C 59.375,-4.824 88.576,-4.656 88.989,14.220 C 120.463,20.713 115.664,59.859 125.984,86.211 C 131.115,99.312 146.046,113.417 147.463,122.667 Z"/>
|
||||
<Path Fill="White" Data=" M 90.988,112.208 C 94.354,113.209 85.358,120.937 81.990,122.207 C 72.150,125.917 58.687,120.227 55.993,112.208 C 68.434,111.411 78.660,111.090 90.988,112.208 Z"/>
|
||||
<Canvas.LayoutTransform>
|
||||
<ScaleTransform ScaleX="0.7" ScaleY="0.7"/>
|
||||
</Canvas.LayoutTransform>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/MuteOn.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/MuteOn.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MuteOn.xaml
|
||||
/// </summary>
|
||||
public partial class MuteOn : UserControl
|
||||
{
|
||||
public MuteOn()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
8
AppleWirelessKeyboard/Glyphs/Next.xaml
Normal file
8
AppleWirelessKeyboard/Glyphs/Next.xaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.Next"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="120" Height="80">
|
||||
<Path Fill="White" Data="F1 M 0,0 L 60,40 L 0,80 L 0,0 Z"/>
|
||||
<Path Fill="White" Data="F1 M 60,0 L 120,40 L 60,80 L 60,0 Z"/>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/Next.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/Next.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Next.xaml
|
||||
/// </summary>
|
||||
public partial class Next : UserControl
|
||||
{
|
||||
public Next()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
7
AppleWirelessKeyboard/Glyphs/Off.xaml
Normal file
7
AppleWirelessKeyboard/Glyphs/Off.xaml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.Off"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="90.000" Height="90.000">
|
||||
<Path Fill="White" Data=" M 45.000,6.000 C 23.461,6.000 6.000,23.461 6.000,45.000 C 6.000,66.539 23.461,84.000 45.000,84.000 C 66.539,84.000 84.000,66.539 84.000,45.000 C 84.000,23.461 66.539,6.000 45.000,6.000 Z M 90.000,45.000 C 90.000,69.853 69.853,90.000 45.000,90.000 C 20.147,90.000 0.000,69.853 0.000,45.000 C 0.000,20.147 20.147,0.000 45.000,0.000 C 69.853,0.000 90.000,20.147 90.000,45.000 Z"/>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/Off.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/Off.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Off.xaml
|
||||
/// </summary>
|
||||
public partial class Off : UserControl
|
||||
{
|
||||
public Off()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
7
AppleWirelessKeyboard/Glyphs/On.xaml
Normal file
7
AppleWirelessKeyboard/Glyphs/On.xaml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.On"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="6.000" Height="89.573">
|
||||
<Path Fill="White" Data=" M 6.000,3.361 C 6.000,32.215 6.000,55.804 6.000,86.500 C 6.000,90.500 0.000,90.596 0.000,86.786 C 0.000,61.799 0.000,35.591 0.000,3.465 C 0.000,-1.284 6.000,-0.990 6.000,3.361 Z"/>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/On.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/On.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for On.xaml
|
||||
/// </summary>
|
||||
public partial class On : UserControl
|
||||
{
|
||||
public On()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
9
AppleWirelessKeyboard/Glyphs/PlayPause.xaml
Normal file
9
AppleWirelessKeyboard/Glyphs/PlayPause.xaml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.PlayPause"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="120" Height="80">
|
||||
<Path Fill="White" Data="F1 M 0,0 L 60,40 L 0,80 L 0,0 Z"/>
|
||||
<Path Fill="White" Data="F1 M 120,80 L 100,80 L 100,0 L 120,0 L 120,80 Z"/>
|
||||
<Path Fill="White" Data="F1 M 80,80 L 60,80 L 60,0 L 80,0 L 80,80 Z"/>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/PlayPause.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/PlayPause.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Play.xaml
|
||||
/// </summary>
|
||||
public partial class PlayPause : UserControl
|
||||
{
|
||||
public PlayPause()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
8
AppleWirelessKeyboard/Glyphs/Previous.xaml
Normal file
8
AppleWirelessKeyboard/Glyphs/Previous.xaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.Previous"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="120" Height="80">
|
||||
<Path Fill="White" Data="F1 M 120,80 L 60,40 L 120,0 L 120,80 Z"/>
|
||||
<Path Fill="White" Data="F1 M 60,80 L 0,40 L 60,0 L 60,80 Z"/>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/Previous.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/Previous.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Previous.xaml
|
||||
/// </summary>
|
||||
public partial class Previous : UserControl
|
||||
{
|
||||
public Previous()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
15
AppleWirelessKeyboard/Glyphs/PrintScreen.xaml
Normal file
15
AppleWirelessKeyboard/Glyphs/PrintScreen.xaml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.PrintScreen"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="179.578" Height="129.042">
|
||||
<Path Fill="White" Data=" M 82.578,10.000 C 87.578,10.000 92.578,10.000 97.578,10.000 C 97.578,7.667 97.578,5.333 97.578,3.000 C 92.578,3.000 87.578,3.000 82.578,3.000 C 82.578,5.333 82.578,7.667 82.578,10.000 Z M 67.578,0.000 C 82.244,0.000 96.911,0.000 111.578,0.000 C 114.690,5.146 116.497,8.591 119.313,13.000 C 101.642,13.000 79.125,13.000 60.024,13.000"/>
|
||||
<Path Fill="White" Data=" M 159.578,6.000 C 159.578,8.645 159.625,10.937 159.625,13.042 C 153.521,13.042 145.334,13.000 137.578,13.000 C 137.578,4.667 150.063,6.000 159.578,6.000 Z"/>
|
||||
<Path Fill="White" Data=" M 24.578,8.000 C 29.244,8.000 33.911,8.000 38.578,8.000 C 38.578,9.667 38.578,11.333 38.578,13.000 C 33.578,13.000 29.578,13.000 24.578,13.000 C 24.578,10.188 24.578,10.420 24.578,8.000 Z"/>
|
||||
<Path Fill="White" Data=" M 179.578,51.000 C 166.578,51.000 153.188,51.000 140.188,51.000 C 136.021,46.417 132.169,40.707 125.578,37.000 C 105.396,25.649 80.640,36.038 71.578,51.000 C 47.911,51.000 23.730,51.000 0.063,51.000 C 0.063,41.089 -0.029,32.500 0.009,25.125 C 0.053,16.688 6.833,14.797 10.188,14.797 C 22.563,14.797 39.860,15.000 54.578,15.000 C 79.632,15.000 138.398,14.797 166.500,14.797 C 176.083,14.797 179.578,16.750 179.578,25.500 C 179.578,32.917 179.578,40.833 179.578,51.000 Z"/>
|
||||
<Path Fill="White" Data=" M 101.578,47.000 C 119.659,43.946 136.605,60.650 129.578,81.000 C 123.352,99.030 97.963,98.708 88.578,90.000 C 74.763,77.183 79.773,50.683 101.578,47.000 Z"/>
|
||||
<Path Fill="White" Data=" M 19.563,129.042 C 0.009,129.042 0.063,118.625 0.063,104.000 C 0.063,95.058 0.063,108.333 0.063,91.125 C 0.063,78.456 0.063,64.917 0.063,55.000 C 22.729,55.000 47.438,55.000 70.104,55.000 C 67.730,60.833 66.311,65.675 66.578,73.000 C 68.225,118.225 133.223,120.977 143.578,83.000 C 145.548,75.774 145.763,63.452 141.578,55.000 C 152.438,55.000 166.938,55.000 179.396,55.000 C 179.396,66.954 179.578,76.806 179.578,90.000 C 179.578,100.926 179.578,102.828 179.578,110.250 C 179.578,120.957 177.349,128.750 159.500,128.750"/>
|
||||
<Canvas.LayoutTransform>
|
||||
<ScaleTransform ScaleX="0.65" ScaleY="0.65"/>
|
||||
</Canvas.LayoutTransform>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/PrintScreen.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/PrintScreen.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for PrintScreen.xaml
|
||||
/// </summary>
|
||||
public partial class PrintScreen : UserControl
|
||||
{
|
||||
public PrintScreen()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
10
AppleWirelessKeyboard/Glyphs/TaskManager.xaml
Normal file
10
AppleWirelessKeyboard/Glyphs/TaskManager.xaml
Normal file
|
@ -0,0 +1,10 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.TaskManager"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Canvas Width="192.616" Height="229.000">
|
||||
<Path Fill="White" Data=" M 70.347,0.000 C 82.460,47.220 92.673,96.341 104.347,144.000 C 114.069,120.722 121.118,94.771 130.347,71.000 C 139.953,90.727 147.412,112.602 156.347,133.000 C 176.366,133.000 192.616,131.063 192.616,143.438 C 192.616,160.000 156.491,156.000 140.347,156.000 C 138.030,149.316 134.747,143.600 133.347,136.000 C 120.378,165.031 112.071,198.725 100.347,229.000 C 89.396,186.952 80.544,142.803 70.347,100.000 C 65.305,117.958 60.846,136.499 57.347,156.000 C 38.741,156.000 0.000,159.500 0.000,145.582 C 0.000,131.333 18.470,133.000 37.347,133.000 C 49.720,90.039 58.673,43.660 70.347,0.000 Z"/>
|
||||
<Canvas.LayoutTransform>
|
||||
<ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
|
||||
</Canvas.LayoutTransform>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/TaskManager.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/TaskManager.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for TaskManager.xaml
|
||||
/// </summary>
|
||||
public partial class TaskManager : UserControl
|
||||
{
|
||||
public TaskManager()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
14
AppleWirelessKeyboard/Glyphs/VolumeOff.xaml
Normal file
14
AppleWirelessKeyboard/Glyphs/VolumeOff.xaml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.VolumeOff"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="192" d:DesignWidth="192">
|
||||
<Canvas Width="49.5" Height="84">
|
||||
<Path Fill="White" Data=" M 27.000,76.000 C 27.000,76.000 9.000,76.000 0.000,76.000 C 0.000,63.333 0.000,38.000 0.000,38.000 L 26.000,38.000 L 65.000,0.000 L 66.000,112.000"/>
|
||||
<Canvas.RenderTransform>
|
||||
<ScaleTransform ScaleX="0.75" ScaleY="0.75"/>
|
||||
</Canvas.RenderTransform>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/VolumeOff.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/VolumeOff.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for VolumeOff.xaml
|
||||
/// </summary>
|
||||
public partial class VolumeOff : UserControl
|
||||
{
|
||||
public VolumeOff()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
17
AppleWirelessKeyboard/Glyphs/VolumeOn.xaml
Normal file
17
AppleWirelessKeyboard/Glyphs/VolumeOn.xaml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<UserControl x:Class="AppleWirelessKeyboard.Glyphs.VolumeOn"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="192" d:DesignWidth="192">
|
||||
<Canvas Width="119.46525" Height="109.50375">
|
||||
<Path Fill="White" Data=" M 114.000,2.008 C 120.750,-8.742 159.287,24.846 159.287,74.605 C 159.287,115.342 121.000,155.508 111.000,144.008 C 104.500,134.175 146.375,121.403 146.375,74.605 C 146.375,22.008 105.500,16.258 114.000,2.008 Z"/>
|
||||
<Path Fill="White" Data=" M 27.000,94.008 C 27.000,94.008 9.000,94.008 0.000,94.008 C 0.000,81.341 0.000,56.008 0.000,56.008 L 26.000,56.008 L 65.000,18.008 L 66.000,130.008"/>
|
||||
<Path Fill="White" Data=" M 96.000,123.008 C 90.125,113.758 117.000,106.327 117.000,76.883 C 117.000,41.258 91.750,33.633 99.463,26.237 C 108.294,17.768 126.785,49.633 126.750,76.508 C 126.715,103.032 101.375,130.883 96.000,123.008 Z"/>
|
||||
<Path Fill="White" Data=" M 84.499,98.220 C 82.567,93.070 94.460,87.513 94.460,73.824 C 94.460,62.008 78.208,57.856 83.651,51.260 C 87.917,46.092 102.259,59.757 102.281,73.824 C 102.305,88.341 87.431,106.035 84.499,98.220 Z"/>
|
||||
<Canvas.RenderTransform>
|
||||
<ScaleTransform ScaleX="0.75" ScaleY="0.75"/>
|
||||
</Canvas.RenderTransform>
|
||||
</Canvas>
|
||||
</UserControl>
|
27
AppleWirelessKeyboard/Glyphs/VolumeOn.xaml.cs
Normal file
27
AppleWirelessKeyboard/Glyphs/VolumeOn.xaml.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Glyphs
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for VolumeOn.xaml
|
||||
/// </summary>
|
||||
public partial class VolumeOn : UserControl
|
||||
{
|
||||
public VolumeOn()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
192
AppleWirelessKeyboard/HIDImports.cs
Normal file
192
AppleWirelessKeyboard/HIDImports.cs
Normal file
|
@ -0,0 +1,192 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.IO;
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
/// <summary>
|
||||
/// Win32 import information for use with the Wiimote library
|
||||
/// </summary>
|
||||
class HIDImports
|
||||
{
|
||||
//
|
||||
// Flags controlling what is included in the device information set built
|
||||
// by SetupDiGetClassDevs
|
||||
//
|
||||
public const int DIGCF_DEFAULT = 0x00000001; // only valid with DIGCF_DEVICEINTERFACE
|
||||
public const int DIGCF_PRESENT = 0x00000002;
|
||||
public const int DIGCF_ALLCLASSES = 0x00000004;
|
||||
public const int DIGCF_PROFILE = 0x00000008;
|
||||
public const int DIGCF_DEVICEINTERFACE = 0x00000010;
|
||||
|
||||
[Flags]
|
||||
public enum EFileAttributes : uint
|
||||
{
|
||||
Readonly = 0x00000001,
|
||||
Hidden = 0x00000002,
|
||||
System = 0x00000004,
|
||||
Directory = 0x00000010,
|
||||
Archive = 0x00000020,
|
||||
Device = 0x00000040,
|
||||
Normal = 0x00000080,
|
||||
Temporary = 0x00000100,
|
||||
SparseFile = 0x00000200,
|
||||
ReparsePoint = 0x00000400,
|
||||
Compressed = 0x00000800,
|
||||
Offline = 0x00001000,
|
||||
NotContentIndexed = 0x00002000,
|
||||
Encrypted = 0x00004000,
|
||||
Write_Through = 0x80000000,
|
||||
Overlapped = 0x40000000,
|
||||
NoBuffering = 0x20000000,
|
||||
RandomAccess = 0x10000000,
|
||||
SequentialScan = 0x08000000,
|
||||
DeleteOnClose = 0x04000000,
|
||||
BackupSemantics = 0x02000000,
|
||||
PosixSemantics = 0x01000000,
|
||||
OpenReparsePoint = 0x00200000,
|
||||
OpenNoRecall = 0x00100000,
|
||||
FirstPipeInstance = 0x00080000
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct SP_DEVINFO_DATA
|
||||
{
|
||||
public uint cbSize;
|
||||
public Guid ClassGuid;
|
||||
public uint DevInst;
|
||||
public IntPtr Reserved;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct SP_DEVICE_INTERFACE_DATA
|
||||
{
|
||||
public int cbSize;
|
||||
public Guid InterfaceClassGuid;
|
||||
public int Flags;
|
||||
public IntPtr RESERVED;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct SP_DEVICE_INTERFACE_DETAIL_DATA
|
||||
{
|
||||
public UInt32 cbSize;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
|
||||
public string DevicePath;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct HIDD_ATTRIBUTES
|
||||
{
|
||||
public int Size;
|
||||
public short VendorID;
|
||||
public short ProductID;
|
||||
public short VersionNumber;
|
||||
}
|
||||
|
||||
[DllImport(@"hid.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern void HidD_GetHidGuid(out Guid gHid);
|
||||
|
||||
[DllImport("hid.dll")]
|
||||
public static extern Boolean HidD_GetAttributes(IntPtr HidDeviceObject, ref HIDD_ATTRIBUTES Attributes);
|
||||
|
||||
[DllImport("hid.dll")]
|
||||
internal extern static bool HidD_SetOutputReport(
|
||||
IntPtr HidDeviceObject,
|
||||
byte[] lpReportBuffer,
|
||||
uint ReportBufferLength);
|
||||
|
||||
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern IntPtr SetupDiGetClassDevs(
|
||||
ref Guid ClassGuid,
|
||||
[MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
|
||||
IntPtr hwndParent,
|
||||
UInt32 Flags
|
||||
);
|
||||
|
||||
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern Boolean SetupDiEnumDeviceInterfaces(
|
||||
IntPtr hDevInfo,
|
||||
//ref SP_DEVINFO_DATA devInfo,
|
||||
IntPtr devInvo,
|
||||
ref Guid interfaceClassGuid,
|
||||
Int32 memberIndex,
|
||||
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
|
||||
);
|
||||
|
||||
[DllImport(@"setupapi.dll", SetLastError = true)]
|
||||
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
|
||||
IntPtr hDevInfo,
|
||||
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
|
||||
IntPtr deviceInterfaceDetailData,
|
||||
UInt32 deviceInterfaceDetailDataSize,
|
||||
out UInt32 requiredSize,
|
||||
IntPtr deviceInfoData
|
||||
);
|
||||
|
||||
[DllImport(@"setupapi.dll", SetLastError = true)]
|
||||
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
|
||||
IntPtr hDevInfo,
|
||||
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
|
||||
ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
|
||||
UInt32 deviceInterfaceDetailDataSize,
|
||||
out UInt32 requiredSize,
|
||||
IntPtr deviceInfoData
|
||||
);
|
||||
|
||||
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern UInt16 SetupDiDestroyDeviceInfoList(IntPtr hDevInfo);
|
||||
|
||||
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
||||
public static extern SafeFileHandle CreateFile(
|
||||
string fileName,
|
||||
[MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
|
||||
[MarshalAs(UnmanagedType.U4)] FileShare fileShare,
|
||||
IntPtr securityAttributes,
|
||||
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
|
||||
[MarshalAs(UnmanagedType.U4)] EFileAttributes flags,
|
||||
IntPtr template);
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool CloseHandle(IntPtr hObject);
|
||||
|
||||
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern bool SetupDiGetDeviceRegistryProperty(
|
||||
IntPtr DeviceInfoSet,
|
||||
ref SP_DEVINFO_DATA DeviceInfoData,
|
||||
uint Property,
|
||||
out UInt32 PropertyRegDataType,
|
||||
IntPtr PropertyBuffer,
|
||||
uint PropertyBufferSize,
|
||||
out UInt32 RequiredSize);
|
||||
|
||||
public enum SPDRP
|
||||
{
|
||||
SPDRP_DEVICEDESC = 0x00000000,
|
||||
SPDRP_HARDWAREID = 0x00000001,
|
||||
SPDRP_COMPATIBLEIDS = 0x00000002,
|
||||
SPDRP_NTDEVICEPATHS = 0x00000003,
|
||||
SPDRP_SERVICE = 0x00000004,
|
||||
SPDRP_CONFIGURATION = 0x00000005,
|
||||
SPDRP_CONFIGURATIONVECTOR = 0x00000006,
|
||||
SPDRP_CLASS = 0x00000007,
|
||||
SPDRP_CLASSGUID = 0x00000008,
|
||||
SPDRP_DRIVER = 0x00000009,
|
||||
SPDRP_CONFIGFLAGS = 0x0000000A,
|
||||
SPDRP_MFG = 0x0000000B,
|
||||
SPDRP_FRIENDLYNAME = 0x0000000C,
|
||||
SPDRP_LOCATION_INFORMATION = 0x0000000D,
|
||||
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0x0000000E,
|
||||
SPDRP_CAPABILITIES = 0x0000000F,
|
||||
SPDRP_UI_NUMBER = 0x00000010,
|
||||
SPDRP_UPPERFILTERS = 0x00000011,
|
||||
SPDRP_LOWERFILTERS = 0x00000012,
|
||||
SPDRP_MAXIMUM_PROPERTY = 0x00000013,
|
||||
}
|
||||
|
||||
[DllImport("setupapi.dll", SetLastError = true)]
|
||||
public static extern bool SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, uint MemberIndex, ref SP_DEVINFO_DATA DeviceInfoData);
|
||||
}
|
||||
}
|
67
AppleWirelessKeyboard/IoControl.cs
Normal file
67
AppleWirelessKeyboard/IoControl.cs
Normal file
|
@ -0,0 +1,67 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class IoControl
|
||||
{
|
||||
#region DeviceIoControl
|
||||
const int OPEN_EXISTING = 3;
|
||||
const uint GENERIC_READ = 0x80000000;
|
||||
const uint GENERIC_WRITE = 0x40000000;
|
||||
const uint FILE_SHARE_WRITE = 0x00000002;
|
||||
const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560;
|
||||
|
||||
[DllImport("kernel32")]
|
||||
private static extern IntPtr CreateFile
|
||||
(string filename, uint desiredAccess,
|
||||
uint shareMode, IntPtr securityAttributes,
|
||||
int creationDisposition, int flagsAndAttributes,
|
||||
IntPtr templateFile);
|
||||
|
||||
[DllImport("kernel32")]
|
||||
private static extern int DeviceIoControl
|
||||
(IntPtr deviceHandle, uint ioControlCode,
|
||||
IntPtr inBuffer, int inBufferSize,
|
||||
IntPtr outBuffer, int outBufferSize,
|
||||
ref int bytesReturned, IntPtr overlapped);
|
||||
|
||||
[DllImport("kernel32")]
|
||||
private static extern int CloseHandle(IntPtr handle);
|
||||
#endregion
|
||||
|
||||
public static void EjectMedia(char driveLetter)
|
||||
{
|
||||
try
|
||||
{
|
||||
string path = "\\\\.\\" + driveLetter + ":";
|
||||
IntPtr handle = CreateFile(path, GENERIC_READ, FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
|
||||
if ((long)handle == -1)
|
||||
{
|
||||
throw new IOException("Unable to open drive " + driveLetter);
|
||||
}
|
||||
int dummy = 0;
|
||||
DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, ref dummy, IntPtr.Zero);
|
||||
CloseHandle(handle);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
public static void EjectAllMedia()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
NotificationCenter.NotifyEject();
|
||||
foreach (DriveInfo drive in DriveInfo.GetDrives())
|
||||
if (drive.DriveType == DriveType.CDRom)
|
||||
{
|
||||
EjectMedia(drive.Name[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
172
AppleWirelessKeyboard/KeyboardControl.cs
Normal file
172
AppleWirelessKeyboard/KeyboardControl.cs
Normal file
|
@ -0,0 +1,172 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Input;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class KeyboardControl
|
||||
{
|
||||
const int VK_SNAPSHOT = 44;
|
||||
const int VK_DELETE = 46;
|
||||
const int VK_MEDIA_NEXT_TRACK = 176;
|
||||
const int VK_MEDIA_PREV_TRACK = 177;
|
||||
const int VK_MEDIA_STOP = 178;
|
||||
const int VK_MEDIA_PLAY_PAUSE = 179;
|
||||
const int VK_END = 37;
|
||||
const int VK_HOME = 36;
|
||||
const int VK_PAGEUP = 33;
|
||||
const int VK_PAGEDOWN = 35;
|
||||
const int VK_F3 = 117;
|
||||
const int VK_INSERT = 45;
|
||||
|
||||
public static void Send(int VKey, KeyboardEvent e = KeyboardEvent.Both)
|
||||
{
|
||||
switch (e)
|
||||
{
|
||||
case KeyboardEvent.Both:
|
||||
{
|
||||
keybd_event((byte)VKey, 0, 0, 0);
|
||||
keybd_event((byte)VKey, 0, 2, 0);
|
||||
}
|
||||
break;
|
||||
case KeyboardEvent.Down:
|
||||
keybd_event((byte)VKey, 0, 0, 0);
|
||||
break;
|
||||
case KeyboardEvent.Up:
|
||||
keybd_event((byte)VKey, 0, 2, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SendInsert()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_INSERT);
|
||||
});
|
||||
}
|
||||
|
||||
public static void SendDelete()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_DELETE);
|
||||
});
|
||||
}
|
||||
|
||||
public static void SendPrintScreen()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_SNAPSHOT);
|
||||
Thread.Sleep(100);
|
||||
NotificationCenter.NotifyPrintScreen();
|
||||
});
|
||||
}
|
||||
|
||||
public static void SendPlayPause()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (iTunesControl.iTunesRunning)
|
||||
iTunesControl.PlayPause();
|
||||
else
|
||||
Send(VK_MEDIA_PLAY_PAUSE);
|
||||
NotificationCenter.NotifyPlayPause();
|
||||
});
|
||||
}
|
||||
|
||||
public static void SendNextTrack()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (iTunesControl.iTunesRunning)
|
||||
iTunesControl.NextSong();
|
||||
else
|
||||
Send(VK_MEDIA_NEXT_TRACK);
|
||||
NotificationCenter.NotifyNext();
|
||||
});
|
||||
}
|
||||
|
||||
public static void SendPreviousTrack()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (iTunesControl.iTunesRunning)
|
||||
iTunesControl.PreviousSong();
|
||||
else
|
||||
Send(VK_MEDIA_PREV_TRACK);
|
||||
NotificationCenter.NotifyPrevious();
|
||||
});
|
||||
}
|
||||
|
||||
public static void OpenTaskManager()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Process taskmgr = Process.GetProcessesByName("taskmgr.exe").FirstOrDefault();
|
||||
if (taskmgr != null)
|
||||
SetForegroundWindow(taskmgr.MainWindowHandle);
|
||||
else
|
||||
Process.Start("taskmgr.exe");
|
||||
NotificationCenter.NotifyTaskManager();
|
||||
});
|
||||
}
|
||||
|
||||
#region PInvoke
|
||||
[DllImport("user32.dll")]
|
||||
static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
|
||||
|
||||
public enum KeyboardEvent
|
||||
{
|
||||
Down = 0, Up = 2, Both
|
||||
}
|
||||
#endregion
|
||||
|
||||
public static void SendPageUp()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_PAGEUP);
|
||||
});
|
||||
}
|
||||
public static void SendPageDown()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_PAGEDOWN);
|
||||
});
|
||||
}
|
||||
public static void SendHome()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_HOME);
|
||||
});
|
||||
}
|
||||
public static void SendEnd()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_END);
|
||||
});
|
||||
}
|
||||
|
||||
public static void SendF3()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Send(VK_F3);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
168
AppleWirelessKeyboard/KeyboardHandler.cs
Normal file
168
AppleWirelessKeyboard/KeyboardHandler.cs
Normal file
|
@ -0,0 +1,168 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Input;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class KeyboardHandler
|
||||
{
|
||||
static KeyboardHandler()
|
||||
{
|
||||
PowerButtonPressCount = 0;
|
||||
}
|
||||
public static bool FMode
|
||||
{
|
||||
get
|
||||
{
|
||||
return AppleWirelessKeyboard.Properties.Settings.Default.FMode;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (AppleWirelessKeyboard.Properties.Settings.Default.FMode != value)
|
||||
{
|
||||
AppleWirelessKeyboard.Properties.Settings.Default.FMode = value;
|
||||
if (value)
|
||||
NotificationCenter.NotifyOn();
|
||||
else NotificationCenter.NotifyOff();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void HandleEject()
|
||||
{
|
||||
if (!AppleKeyboardHID2.FnDown)
|
||||
FMode = !FMode;
|
||||
else IoControl.EjectAllMedia();
|
||||
}
|
||||
|
||||
public static bool HandleKeyDown(KeyboardListener.KeyHookEventArgs e)
|
||||
{
|
||||
bool F = (FMode || e.ModifierFn) && !e.ModifierAnyNative;
|
||||
|
||||
switch (e.Key)
|
||||
{
|
||||
case Key.F3:
|
||||
if (F)
|
||||
{
|
||||
KeyboardControl.SendPrintScreen();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F4:
|
||||
if (F)
|
||||
{
|
||||
KeyboardControl.OpenTaskManager();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F2:
|
||||
if (F)
|
||||
{
|
||||
KeyboardControl.SendF3();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F7:
|
||||
if (F)
|
||||
{
|
||||
KeyboardControl.SendPreviousTrack();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F8:
|
||||
if (F)
|
||||
{
|
||||
KeyboardControl.SendPlayPause();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F9:
|
||||
if (F)
|
||||
{
|
||||
KeyboardControl.SendNextTrack();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F10:
|
||||
if (F)
|
||||
{
|
||||
VolumeControl.ToggleMute();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F11:
|
||||
if (F)
|
||||
{
|
||||
VolumeControl.VolumeDown();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.F12:
|
||||
if (F)
|
||||
{
|
||||
VolumeControl.VolumeUp();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.Back:
|
||||
if (e.ModifierFn)
|
||||
{
|
||||
KeyboardControl.SendDelete();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.Up:
|
||||
if (e.ModifierFn)
|
||||
{
|
||||
KeyboardControl.SendPageUp();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.Down:
|
||||
if (e.ModifierFn)
|
||||
{
|
||||
KeyboardControl.SendPageDown();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.Left:
|
||||
if(e.ModifierFn)
|
||||
{
|
||||
KeyboardControl.SendHome();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.Right:
|
||||
if (e.ModifierFn)
|
||||
{
|
||||
KeyboardControl.SendEnd();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Key.Enter:
|
||||
if (e.ModifierFn)
|
||||
{
|
||||
KeyboardControl.SendInsert();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (e.ModifierAnyAlt && (FMode || e.ModifierFn))
|
||||
if (e.Key == Key.F3)
|
||||
{
|
||||
KeyboardControl.SendPrintScreen();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
public static int PowerButtonPressCount { get; set; }
|
||||
|
||||
}
|
||||
}
|
210
AppleWirelessKeyboard/KeyboardListener.cs
Normal file
210
AppleWirelessKeyboard/KeyboardListener.cs
Normal file
|
@ -0,0 +1,210 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Input;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
/// <summary>
|
||||
/// A class that manages a global low level keyboard hook
|
||||
/// </summary>
|
||||
public static class KeyboardListener
|
||||
{
|
||||
static KeyboardListener()
|
||||
{
|
||||
HookedKeys = new List<Key>();
|
||||
Hook = IntPtr.Zero;
|
||||
}
|
||||
#region PInvoke Structures
|
||||
public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);
|
||||
|
||||
public struct keyboardHookStruct
|
||||
{
|
||||
public int vkCode;
|
||||
public int scanCode;
|
||||
public int flags;
|
||||
public int time;
|
||||
public int dwExtraInfo;
|
||||
}
|
||||
|
||||
private const int WH_KEYBOARD_LL = 13;
|
||||
private const int WM_KEYDOWN = 0x100;
|
||||
private const int WM_KEYUP = 0x101;
|
||||
private const int WM_SYSKEYDOWN = 0x104;
|
||||
private const int WM_SYSKEYUP = 0x105;
|
||||
#endregion
|
||||
|
||||
#region Public declarations
|
||||
|
||||
public static List<Key> HookedKeys { get; set; }
|
||||
internal static IntPtr Hook { get; set; }
|
||||
|
||||
public static event KeyHookEventHandler KeyDown;
|
||||
public static event KeyHookEventHandler KeyUp;
|
||||
|
||||
public static bool ModifierLeftAlt { get; set; }
|
||||
public static bool ModifierRightAlt { get; set; }
|
||||
public static bool ModifierLeftCtrl { get; set; }
|
||||
public static bool ModifierRightCtrl { get; set; }
|
||||
public static bool ModifierLeftShift { get; set; }
|
||||
public static bool ModifierRightShift { get; set; }
|
||||
public static bool ModifierLeftWin { get; set; }
|
||||
public static bool ModifierRightWin { get; set; }
|
||||
public static bool ModifierCapsLock { get; set; }
|
||||
public static bool ModifierFn { get; set; }
|
||||
|
||||
public class KeyHookEventArgs
|
||||
{
|
||||
public KeyHookEventArgs()
|
||||
{
|
||||
}
|
||||
public Key Key { get; set; }
|
||||
public bool ModifierLeftAlt { get; set; }
|
||||
public bool ModifierRightAlt { get; set; }
|
||||
public bool ModifierLeftCtrl { get; set; }
|
||||
public bool ModifierRightCtrl { get; set; }
|
||||
public bool ModifierLeftShift { get; set; }
|
||||
public bool ModifierRightShift { get; set; }
|
||||
public bool ModifierLeftWin { get; set; }
|
||||
public bool ModifierRightWin { get; set; }
|
||||
public bool ModifierCapsLock { get; set; }
|
||||
public bool ModifierFn { get; set; }
|
||||
|
||||
public bool ModifierAnyAlt { get { return ModifierLeftAlt || ModifierRightAlt; } set { ModifierLeftAlt = value; } }
|
||||
public bool ModifierAnyCtrl { get { return ModifierLeftCtrl || ModifierRightCtrl; } set { ModifierLeftCtrl = value; } }
|
||||
public bool ModifierAnyShift { get { return ModifierLeftShift || ModifierRightShift; } set { ModifierLeftShift = value; } }
|
||||
public bool ModifierAnyWin { get { return ModifierLeftWin || ModifierRightWin; } set { ModifierLeftWin = value; } }
|
||||
|
||||
public bool ModifierAnyNative { get { return (((ModifierAnyAlt) || (ModifierAnyWin)) || ((ModifierAnyCtrl) || (ModifierAnyShift))); } }
|
||||
public bool ModifierAny { get { return ((ModifierAny) || (ModifierFn)); } }
|
||||
}
|
||||
|
||||
public delegate bool KeyHookEventHandler(KeyHookEventArgs e);
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
|
||||
internal static void SetModifiers(Key key, bool IsPressed, int VKey)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case Key.LeftAlt:
|
||||
ModifierLeftAlt = IsPressed;
|
||||
break;
|
||||
case Key.RightAlt:
|
||||
ModifierRightAlt = IsPressed;
|
||||
break;
|
||||
case Key.RightCtrl:
|
||||
ModifierRightCtrl = IsPressed;
|
||||
break;
|
||||
case Key.LeftCtrl:
|
||||
ModifierLeftCtrl = IsPressed;
|
||||
break;
|
||||
case Key.LeftShift:
|
||||
ModifierLeftShift = IsPressed;
|
||||
break;
|
||||
case Key.RightShift:
|
||||
ModifierRightShift = IsPressed;
|
||||
break;
|
||||
case Key.CapsLock:
|
||||
ModifierCapsLock = IsPressed;
|
||||
break;
|
||||
case Key.LWin:
|
||||
ModifierLeftWin = IsPressed;
|
||||
break;
|
||||
case Key.RWin:
|
||||
ModifierRightWin = IsPressed;
|
||||
break;
|
||||
}
|
||||
if (!AppleKeyboardHID2.Registered)
|
||||
AppleKeyboardHID2.Start();
|
||||
}
|
||||
internal static KeyHookEventArgs CreateEventArgs(Key key)
|
||||
{
|
||||
return new KeyHookEventArgs()
|
||||
{
|
||||
Key = key,
|
||||
ModifierCapsLock = ModifierCapsLock,
|
||||
ModifierLeftAlt = ModifierLeftAlt,
|
||||
ModifierRightAlt = ModifierRightAlt,
|
||||
ModifierLeftCtrl = ModifierLeftCtrl,
|
||||
ModifierRightCtrl = ModifierRightCtrl,
|
||||
ModifierLeftShift = ModifierLeftShift,
|
||||
ModifierRightShift = ModifierRightShift,
|
||||
ModifierLeftWin = ModifierLeftWin,
|
||||
ModifierRightWin = ModifierRightWin,
|
||||
ModifierFn = ModifierFn
|
||||
};
|
||||
}
|
||||
|
||||
public static keyboardHookProc HookProcessor { get; set; }
|
||||
|
||||
public static void Register()
|
||||
{
|
||||
HookProcessor = Hook_Callback;
|
||||
IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
|
||||
Hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookProcessor, hInstance, 0);
|
||||
}
|
||||
|
||||
public static void UnRegister()
|
||||
{
|
||||
UnhookWindowsHookEx(Hook);
|
||||
}
|
||||
|
||||
public static bool TriggerKeyDown(KeyHookEventArgs args)
|
||||
{
|
||||
if (KeyDown != null)
|
||||
return KeyDown(args);
|
||||
else return false;
|
||||
}
|
||||
public static bool TriggerKeyUp(KeyHookEventArgs args)
|
||||
{
|
||||
if (KeyUp != null)
|
||||
return KeyUp(args);
|
||||
else return false;
|
||||
}
|
||||
public static int Hook_Callback(int code, int wParam, ref keyboardHookStruct lParam)
|
||||
{
|
||||
if (code >= 0)
|
||||
{
|
||||
Key key = (Key)System.Windows.Input.KeyInterop.KeyFromVirtualKey(lParam.vkCode);
|
||||
bool IsPressed = (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN);
|
||||
|
||||
SetModifiers(key, IsPressed, lParam.vkCode);
|
||||
if (HookedKeys.Contains(key))
|
||||
{
|
||||
KeyHookEventArgs kea = CreateEventArgs(key);
|
||||
|
||||
bool Handled = false;
|
||||
if (IsPressed)
|
||||
Handled = TriggerKeyDown(kea);
|
||||
else
|
||||
Handled = TriggerKeyUp(kea);
|
||||
|
||||
if (Handled)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return CallNextHookEx(Hook, code, wParam, ref lParam);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region DLL imports
|
||||
[DllImport("user32.dll")]
|
||||
static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern IntPtr GetModuleHandle(string lpModuleName);
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
15
AppleWirelessKeyboard/MainWindow.xaml
Normal file
15
AppleWirelessKeyboard/MainWindow.xaml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<Window x:Class="AppleWirelessKeyboard.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
ShowInTaskbar="False" Background="Transparent" Topmost="True"
|
||||
WindowStyle="None" WindowStartupLocation="CenterScreen" Height="192" Width="192" AllowsTransparency="True">
|
||||
<Border Background="#99000000" CornerRadius="12">
|
||||
<Grid>
|
||||
<ContentControl Content="{Binding Glyph}"/>
|
||||
<StackPanel Height="6" Width="141" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="12" Orientation="Horizontal" Name="ValueBar"/>
|
||||
<Grid.Effect>
|
||||
<DropShadowEffect ShadowDepth="2" Opacity="0.9"/>
|
||||
</Grid.Effect>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Window>
|
60
AppleWirelessKeyboard/MainWindow.xaml.cs
Normal file
60
AppleWirelessKeyboard/MainWindow.xaml.cs
Normal file
|
@ -0,0 +1,60 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Media.Animation;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowOff(Control glyph, bool valueBar = false, int value = 0)
|
||||
{
|
||||
this.DataContext = new { Glyph = glyph };
|
||||
|
||||
if (valueBar) ValueBar.Visibility = System.Windows.Visibility.Visible;
|
||||
else ValueBar.Visibility = System.Windows.Visibility.Collapsed;
|
||||
|
||||
MakeValue(value);
|
||||
|
||||
this.Show();
|
||||
|
||||
DoubleAnimationUsingKeyFrames Fade = new DoubleAnimationUsingKeyFrames();
|
||||
Fade.Duration = new Duration(TimeSpan.FromSeconds(1));
|
||||
Fade.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.FromPercent(0)));
|
||||
Fade.KeyFrames.Add(new LinearDoubleKeyFrame(1, KeyTime.FromPercent(0.5)));
|
||||
Fade.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromPercent(1)));
|
||||
BeginAnimation(OpacityProperty, Fade);
|
||||
}
|
||||
public void MakeValue(int value)
|
||||
{
|
||||
ValueBar.Children.Clear();
|
||||
|
||||
for (int i = 0; i <= value; i++)
|
||||
{
|
||||
Rectangle rect = new Rectangle();
|
||||
rect.Fill = new SolidColorBrush(Colors.White);
|
||||
rect.Width = 6;
|
||||
rect.Height = 6;
|
||||
rect.Margin = new Thickness(0, 0, 3, 0);
|
||||
ValueBar.Children.Add(rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
100
AppleWirelessKeyboard/NotificationCenter.cs
Normal file
100
AppleWirelessKeyboard/NotificationCenter.cs
Normal file
|
@ -0,0 +1,100 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class NotificationCenter
|
||||
{
|
||||
static NotificationCenter()
|
||||
{
|
||||
|
||||
}
|
||||
public static void NotifyMuteOn()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke(new Action(delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.MuteOn());
|
||||
}));
|
||||
}
|
||||
public static void NotifyMuteOff()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke(new Action(delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.MuteOff());
|
||||
}));
|
||||
}
|
||||
public static void NotifyNoVolume()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke(new Action(delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.VolumeOff());
|
||||
}));
|
||||
}
|
||||
public static void NotifyVolumeLevel(int level)//1-16
|
||||
{
|
||||
App.Window.Dispatcher.Invoke(new Action(delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.VolumeOn(), true, level);
|
||||
}));
|
||||
}
|
||||
public static void NotifyTaskManager()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.TaskManager());
|
||||
});
|
||||
}
|
||||
public static void NotifyPrintScreen()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.PrintScreen());
|
||||
});
|
||||
}
|
||||
public static void NotifyOn()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.On());
|
||||
});
|
||||
}
|
||||
public static void NotifyOff()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.Off());
|
||||
});
|
||||
}
|
||||
public static void NotifyPlayPause()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.PlayPause());
|
||||
});
|
||||
}
|
||||
public static void NotifyPrevious()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.Previous());
|
||||
});
|
||||
}
|
||||
public static void NotifyNext()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.Next());
|
||||
});
|
||||
}
|
||||
|
||||
internal static void NotifyEject()
|
||||
{
|
||||
App.Window.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
App.Window.ShowOff(new Glyphs.Eject());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
41
AppleWirelessKeyboard/PowerControl.cs
Normal file
41
AppleWirelessKeyboard/PowerControl.cs
Normal file
|
@ -0,0 +1,41 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public class PowerControl
|
||||
{
|
||||
public static void Hibernate()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (PowerStatusBox.PowerAction("Hibernate", 10))
|
||||
SetSuspendState(true, true, true);
|
||||
});
|
||||
}
|
||||
|
||||
public static void Shutdown()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (PowerStatusBox.PowerAction("Shut Down", 10))
|
||||
{
|
||||
ProcessStartInfo si = new ProcessStartInfo("shutdown", "/s /t 0");
|
||||
si.CreateNoWindow = true;
|
||||
si.WindowStyle = ProcessWindowStyle.Hidden;
|
||||
Process.Start(si);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
[DllImport("powrprof.dll", SetLastError = true)]
|
||||
static extern bool SetSuspendState(bool hibernate, bool forceCritical, bool disableWakeEvent);
|
||||
}
|
||||
}
|
16
AppleWirelessKeyboard/PowerStatusBox.xaml
Normal file
16
AppleWirelessKeyboard/PowerStatusBox.xaml
Normal file
|
@ -0,0 +1,16 @@
|
|||
<Window x:Class="AppleWirelessKeyboard.PowerStatusBox"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Background="Transparent" WindowStartupLocation="CenterScreen"
|
||||
Height="200" Width="320" WindowStyle="None" Closing="Window_Closing" Topmost="True" AllowsTransparency="True" ShowInTaskbar="False" Loaded="Window_Loaded">
|
||||
<Border CornerRadius="10" Background="#99000000">
|
||||
<Grid>
|
||||
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Name="txtStatus" Foreground="White" Text="The system is about to shut down in 10 seconds.">
|
||||
<TextBlock.BitmapEffect>
|
||||
<DropShadowBitmapEffect ShadowDepth="2" Opacity="0.9"/>
|
||||
</TextBlock.BitmapEffect>
|
||||
</TextBlock>
|
||||
<Button VerticalAlignment="Bottom" HorizontalAlignment="Left" Name="btnCancel" Content="Cancel" Width="64" Margin="20" Click="btnCancel_Click"/>
|
||||
<Button VerticalAlignment="Bottom" HorizontalAlignment="Right" Name="btnOK" Content="OK" Width="64" Margin="20" Click="btnOK_Click"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Window>
|
104
AppleWirelessKeyboard/PowerStatusBox.xaml.cs
Normal file
104
AppleWirelessKeyboard/PowerStatusBox.xaml.cs
Normal file
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
using System.Timers;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for PowerStatusBox.xaml
|
||||
/// </summary>
|
||||
public partial class PowerStatusBox : Window
|
||||
{
|
||||
public PowerStatusBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
T = new Timer(1000);
|
||||
T.Elapsed += new ElapsedEventHandler(T_Elapsed);
|
||||
}
|
||||
|
||||
void T_Elapsed(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
if (Seconds > 0)
|
||||
{
|
||||
Seconds--;
|
||||
Status();
|
||||
}
|
||||
else
|
||||
{
|
||||
T.Stop();
|
||||
Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
DialogResult = true;
|
||||
Close();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
T.Stop();
|
||||
DialogResult = false;
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
T.Stop();
|
||||
DialogResult = true;
|
||||
}
|
||||
|
||||
public void Status()
|
||||
{
|
||||
Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
txtStatus.Text = string.Format("The system is about to {0} in {1} seconds.", Action, Seconds);
|
||||
});
|
||||
}
|
||||
|
||||
public string Action { get; set; }
|
||||
public int Seconds { get; set; }
|
||||
public Timer T { get; set; }
|
||||
|
||||
public static bool PowerAction(string action, int seconds)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
App.Current.Dispatcher.Invoke((Action)delegate
|
||||
{
|
||||
PowerStatusBox frm = new PowerStatusBox();
|
||||
|
||||
frm.Action = action;
|
||||
frm.Seconds = seconds;
|
||||
frm.Status();
|
||||
ret = (bool)frm.ShowDialog();
|
||||
});
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
if (!DialogResult.HasValue)
|
||||
{
|
||||
T.Stop();
|
||||
DialogResult = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Status();
|
||||
T.Start();
|
||||
}
|
||||
}
|
||||
}
|
55
AppleWirelessKeyboard/Properties/AssemblyInfo.cs
Normal file
55
AppleWirelessKeyboard/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,55 @@
|
|||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("AppleWirelessKeyboard")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("uxsoft")]
|
||||
[assembly: AssemblyProduct("AppleWirelessKeyboard")]
|
||||
[assembly: AssemblyCopyright("Copyright © uxsoft 2010-2011")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
//In order to begin building localizable applications, set
|
||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
|
||||
//inside a <PropertyGroup>. For example, if you are using US english
|
||||
//in your source files, set the <UICulture> to en-US. Then uncomment
|
||||
//the NeutralResourceLanguage attribute below. Update the "en-US" in
|
||||
//the line below to match the UICulture setting in the project file.
|
||||
|
||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||
//(used if a resource is not found in the page,
|
||||
// or application resource dictionaries)
|
||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||
//(used if a resource is not found in the page,
|
||||
// app, or any theme specific resource dictionaries)
|
||||
)]
|
||||
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("2.1.0.0")]
|
||||
[assembly: AssemblyFileVersion("2.1.0.0")]
|
63
AppleWirelessKeyboard/Properties/Resources.Designer.cs
generated
Normal file
63
AppleWirelessKeyboard/Properties/Resources.Designer.cs
generated
Normal file
|
@ -0,0 +1,63 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.225
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace AppleWirelessKeyboard.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AppleWirelessKeyboard.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
117
AppleWirelessKeyboard/Properties/Resources.resx
Normal file
117
AppleWirelessKeyboard/Properties/Resources.resx
Normal file
|
@ -0,0 +1,117 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
86
AppleWirelessKeyboard/Properties/Settings.Designer.cs
generated
Normal file
86
AppleWirelessKeyboard/Properties/Settings.Designer.cs
generated
Normal file
|
@ -0,0 +1,86 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.225
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace AppleWirelessKeyboard.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
public bool FMode {
|
||||
get {
|
||||
return ((bool)(this["FMode"]));
|
||||
}
|
||||
set {
|
||||
this["FMode"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool FnEnabled {
|
||||
get {
|
||||
return ((bool)(this["FnEnabled"]));
|
||||
}
|
||||
set {
|
||||
this["FnEnabled"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string Version {
|
||||
get {
|
||||
return ((string)(this["Version"]));
|
||||
}
|
||||
set {
|
||||
this["Version"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool SwapCtrlFn {
|
||||
get {
|
||||
return ((bool)(this["SwapCtrlFn"]));
|
||||
}
|
||||
set {
|
||||
this["SwapCtrlFn"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string Hash {
|
||||
get {
|
||||
return ((string)(this["Hash"]));
|
||||
}
|
||||
set {
|
||||
this["Hash"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
21
AppleWirelessKeyboard/Properties/Settings.settings
Normal file
21
AppleWirelessKeyboard/Properties/Settings.settings
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AppleWirelessKeyboard.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="FMode" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="FnEnabled" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Version" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="SwapCtrlFn" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Hash" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
37
AppleWirelessKeyboard/StartupShortcut.cs
Normal file
37
AppleWirelessKeyboard/StartupShortcut.cs
Normal file
|
@ -0,0 +1,37 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class StartupShortcut
|
||||
{
|
||||
public static void Register()
|
||||
{
|
||||
//string file = GetShortcutPath();
|
||||
//string shortcut = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.ActivationUri.ToString();
|
||||
//StreamWriter sw = new StreamWriter(file);
|
||||
//sw.Write(shortcut);
|
||||
//sw.Close();
|
||||
}
|
||||
public static void UnRegister()
|
||||
{
|
||||
File.Delete(GetShortcutPath());
|
||||
}
|
||||
public static string GetShortcutPath()
|
||||
{
|
||||
string folder = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
|
||||
return Path.Combine(folder, Path.ChangeExtension(Assembly.GetEntryAssembly().GetName().Name, ".appref-ms"));
|
||||
}
|
||||
public static bool IsRegistered
|
||||
{
|
||||
get
|
||||
{
|
||||
return File.Exists(GetShortcutPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
55
AppleWirelessKeyboard/TrayIcon.cs
Normal file
55
AppleWirelessKeyboard/TrayIcon.cs
Normal file
|
@ -0,0 +1,55 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Drawing;
|
||||
using System.Diagnostics;
|
||||
using AppleWirelessKeyboard.Views;
|
||||
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class TrayIcon
|
||||
{
|
||||
static TrayIcon()
|
||||
{
|
||||
NotifyIcon icon = new NotifyIcon();
|
||||
icon.Text = "AppleWirelessKeyboard";
|
||||
icon.Icon = new Icon(App.GetResourceStream(new Uri("pack://application:,,,/Gnome-Preferences-Desktop-Keyboard-Shortcuts.ico")).Stream);
|
||||
icon.Visible = true;
|
||||
|
||||
MenuItem[] menuItems = new[] {
|
||||
new MenuItem("Configure", TriggerConfigure),
|
||||
new MenuItem("Restart", TriggerRestart),
|
||||
new MenuItem("Refresh", TriggerRefresh),
|
||||
new MenuItem("Exit", TriggerExit)
|
||||
};
|
||||
|
||||
ContextMenu menu = new ContextMenu(menuItems);
|
||||
icon.ContextMenu = menu;
|
||||
}
|
||||
|
||||
public static void Show() { }
|
||||
|
||||
private static void TriggerRestart(object sender, EventArgs e)
|
||||
{
|
||||
Application.Restart();
|
||||
}
|
||||
private static void TriggerConfigure(object sender, EventArgs e)
|
||||
{
|
||||
(new Configuration()).Show();
|
||||
}
|
||||
private static void TriggerExit(object sender, EventArgs e)
|
||||
{
|
||||
//Application.Exit();
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
public static void TriggerRefresh(object sender, EventArgs e)
|
||||
{
|
||||
if (AppleKeyboardHID2.Registered)
|
||||
AppleKeyboardHID2.Shutdown();
|
||||
AppleKeyboardHID2.Start();
|
||||
}
|
||||
}
|
||||
}
|
22
AppleWirelessKeyboard/Views/Configuration.xaml
Normal file
22
AppleWirelessKeyboard/Views/Configuration.xaml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<Window x:Class="AppleWirelessKeyboard.Views.Configuration"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:properties="clr-namespace:AppleWirelessKeyboard.Properties"
|
||||
Title="Configuration" Height="300" Width="300">
|
||||
<Window.Resources>
|
||||
<properties:Settings x:Key="Settings"/>
|
||||
</Window.Resources>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="2*"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock Text="Swap Control and Fn:" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,6,0" Foreground="Gray"/>
|
||||
<CheckBox Name="swapCtrlFn" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding Source={StaticResource Settings}, Path=Default.SwapCtrlFn}"/>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
26
AppleWirelessKeyboard/Views/Configuration.xaml.cs
Normal file
26
AppleWirelessKeyboard/Views/Configuration.xaml.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace AppleWirelessKeyboard.Views
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Configuration.xaml
|
||||
/// </summary>
|
||||
public partial class Configuration : Window
|
||||
{
|
||||
public Configuration()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
48
AppleWirelessKeyboard/VolumeControl.cs
Normal file
48
AppleWirelessKeyboard/VolumeControl.cs
Normal file
|
@ -0,0 +1,48 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using CoreAudioApi;
|
||||
namespace AppleWirelessKeyboard
|
||||
{
|
||||
public static class VolumeControl
|
||||
{
|
||||
static VolumeControl()
|
||||
{
|
||||
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
|
||||
MMDevice device = enumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
|
||||
Controller = device.AudioEndpointVolume;
|
||||
}
|
||||
private static AudioEndpointVolume Controller = null;
|
||||
public static void ToggleMute()
|
||||
{
|
||||
Controller.Mute = !Controller.Mute;
|
||||
if (Controller.Mute)
|
||||
NotificationCenter.NotifyMuteOff();
|
||||
else
|
||||
NotificationCenter.NotifyMuteOn();
|
||||
|
||||
}
|
||||
public static void VolumeUp()
|
||||
{
|
||||
if (Controller.MasterVolumeLevelScalar > 0.9375f)
|
||||
Controller.MasterVolumeLevelScalar = 1.0f;
|
||||
else Controller.MasterVolumeLevelScalar += 0.0625f;
|
||||
NotificationCenter.NotifyVolumeLevel((int)(Controller.MasterVolumeLevelScalar / 0.0625));
|
||||
}
|
||||
public static void VolumeDown()
|
||||
{
|
||||
if (Controller.MasterVolumeLevelScalar < 0.0625)
|
||||
{
|
||||
Controller.MasterVolumeLevelScalar = 0;
|
||||
NotificationCenter.NotifyNoVolume();
|
||||
}
|
||||
else
|
||||
{
|
||||
Controller.MasterVolumeLevelScalar -= 0.0625f;
|
||||
NotificationCenter.NotifyVolumeLevel((int)(Controller.MasterVolumeLevelScalar / 0.0625));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue