Last active
December 16, 2015 17:05
-
-
Save kellyelton/ff636e08ee22a613f71a to your computer and use it in GitHub Desktop.
MouseClick Drum
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.IO; | |
using System.Reflection; | |
using System.Runtime.InteropServices; | |
using System.Threading.Tasks; | |
using System.Windows.Media; | |
namespace DevTools.Services | |
{ | |
public class ClickSoundService : IService | |
{ | |
//System.Media.SoundPlayer _player; | |
public ClickSoundService() | |
{ | |
} | |
public void Start() | |
{ | |
MouseHook.Start(); | |
MouseHook.MouseAction += Event; | |
} | |
public void Stop() | |
{ | |
MouseHook.MouseAction -= Event; | |
MouseHook.Stop(); | |
} | |
private void Event(object sender, EventArgs e) | |
{ | |
var b = Directory.GetParent(Assembly.GetEntryAssembly().Location); | |
var path = Path.Combine(b.FullName, "Resources\\click.wav"); | |
MediaPlayer player = new MediaPlayer(); | |
player.Open(new Uri(path)); | |
player.Play(); | |
player.MediaEnded += Player_MediaEnded; | |
} | |
private void Player_MediaEnded(object sender, EventArgs e) | |
{ | |
var player = sender as MediaPlayer; | |
player.MediaEnded -= Player_MediaEnded; | |
player.Close(); | |
} | |
} | |
// Jacked from http://stackoverflow.com/questions/11607133/global-mouse-event-handler#answer-11608209 | |
public static class MouseHook | |
{ | |
public static event EventHandler MouseAction = delegate { }; | |
public static void Start() | |
{ | |
_hookID = SetHook(_proc); | |
} | |
public static void Stop() | |
{ | |
UnhookWindowsHookEx(_hookID); | |
} | |
private static LowLevelMouseProc _proc = HookCallback; | |
private static IntPtr _hookID = IntPtr.Zero; | |
private static IntPtr SetHook(LowLevelMouseProc proc) | |
{ | |
using (Process curProcess = Process.GetCurrentProcess()) | |
using (ProcessModule curModule = curProcess.MainModule) | |
{ | |
return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0); | |
} | |
} | |
private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); | |
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) | |
{ | |
if (nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam) | |
{ | |
MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); | |
MouseAction(null, new EventArgs()); | |
} | |
return CallNextHookEx(_hookID, nCode, wParam, lParam); | |
} | |
private const int WH_MOUSE_LL = 14; | |
private enum MouseMessages | |
{ | |
WM_LBUTTONDOWN = 0x0201, | |
WM_LBUTTONUP = 0x0202, | |
WM_MOUSEMOVE = 0x0200, | |
WM_MOUSEWHEEL = 0x020A, | |
WM_RBUTTONDOWN = 0x0204, | |
WM_RBUTTONUP = 0x0205 | |
} | |
[StructLayout(LayoutKind.Sequential)] | |
private struct POINT | |
{ | |
public int x; | |
public int y; | |
} | |
[StructLayout(LayoutKind.Sequential)] | |
private struct MSLLHOOKSTRUCT | |
{ | |
public POINT pt; | |
public uint mouseData; | |
public uint flags; | |
public uint time; | |
public IntPtr dwExtraInfo; | |
} | |
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] | |
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId); | |
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] | |
[return: MarshalAs(UnmanagedType.Bool)] | |
private static extern bool UnhookWindowsHookEx(IntPtr hhk); | |
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] | |
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); | |
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] | |
private static extern IntPtr GetModuleHandle(string lpModuleName); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment