using System; using System.Collections.Generic; using System.Linq; using System.Diagnostics; namespace DreamCheekyUSB { class Program { static string strCMD = ""; static string strCMDARGs = ""; static string strMacro = ""; static int count = 0; static int Main(string[] args) { int actions = 0; DreamCheekyBTN btn = null; try { if (args.ContainsInsensitive("debug")) { Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); } string devicearg = args.StartsWith("device=").FirstOrDefault(); if (string.IsNullOrEmpty(devicearg)) { Trace.WriteLine("\r\nConnecting to DreamCheekyBTN using default values..."); try { btn = new DreamCheekyBTN(); } catch (Exception ignored) { Trace.WriteLine(ignored.Message); Trace.WriteLine("No Iron Man USB Stress Buttons found.\r\nSearching for Big Red Buttons..."); btn = new DreamCheekyBigRedBTN(DreamCheekyBigRedBTN.DEFAULT_VENDOR_ID, DreamCheekyBigRedBTN.DEFAULT_PRODUCT_ID); } } else { Trace.WriteLine("\r\nConnecting to DreamCheekyBTN using specified device {0}...", devicearg); string[] deviceSplit = devicearg.Substring(7).Split(','); if (deviceSplit.Length == 1) { //One argument = device path var searchString = string.Format("pid_{0}", DreamCheekyBigRedBTN.PID); if (deviceSplit[0].Contains(searchString)) { Trace.WriteLine("Device is a Big Red Button..."); btn = new DreamCheekyBigRedBTN(deviceSplit[0]); } else { Trace.WriteLine("Device is a Iron Man USB Stress Button..."); btn = new DreamCheekyBTN(deviceSplit[0]); } } else { //Two or Three arguments = VID,PID,Count=0 int devicecount = 0; if (deviceSplit.Length > 2) { devicecount = int.Parse(deviceSplit[2]); } int VID = int.Parse(deviceSplit[0].Substring(2), System.Globalization.NumberStyles.HexNumber); int PID = int.Parse(deviceSplit[1].Substring(2), System.Globalization.NumberStyles.HexNumber); if (PID == DreamCheekyBTN.DEFAULT_PRODUCT_ID) { btn = new DreamCheekyBTN(VID, PID, devicecount); } else { btn = new DreamCheekyBigRedBTN(VID, PID, devicecount); } } } string cmdarg = args.StartsWith("CMD=").FirstOrDefault(); if (!string.IsNullOrEmpty(cmdarg)) { actions++; strCMD = cmdarg.Substring(4); Console.WriteLine("Setting command to: " + strCMD); } string argarg = args.StartsWith("ARG=").FirstOrDefault(); if (!string.IsNullOrEmpty(argarg)) { strCMDARGs = argarg.Substring(4); Console.WriteLine("Setting command arguments to: " + strCMDARGs); } string macroarg = args.StartsWith("MACRO=").FirstOrDefault(); if (!string.IsNullOrEmpty(macroarg)) { actions++; string[] macosplit = macroarg.Split('='); strMacro = macosplit[1]; Console.WriteLine("Setting Macro to: " + strMacro); } if (actions > 0) { btn.RegisterCallback(DoAction); Console.WriteLine("Listening for button press events. Press any key to escape..."); Console.ReadKey(true); } } catch (Exception ex) { Trace.TraceError("\r\n\r\nError: " + ex.Message + "\r\n\r\n"); } //Pause on exit or display usage syntax if (actions > 0) { Trace.WriteLine("Finished\r\n"); } else { //No actions specified, show help Console.WriteLine(" DreamCheekyBTN.exe [device=...] [options]"); Console.WriteLine("\r\nExamples:"); Console.WriteLine(" DreamCheekyBTN.exe debug MACRO=ASDF~ (ASDF then Enter)"); Console.WriteLine(" DreamCheekyBTN.exe MACRO=%+{F1} (ALT+SHIFT+F1)"); Console.WriteLine(" DreamCheekyBTN.exe CMD=c:\\temp\\test.bat"); Console.WriteLine(@" DreamCheekyBTN.exe CMD=powershell ARG=""-noexit -executionpolicy unrestricted -File c:\test.ps1"""); Console.WriteLine("\r\n\r\nDevice Path:"); Console.WriteLine(" Optional, Defaults to first USB device with VID=0x1D34 and PID=0x0008"); Console.WriteLine(" Example (VID,PID,Index): device=\"0x1D34,0x0008,0\""); Console.WriteLine(" Example (Path): device=" + @"""\\?\hid#vid_1d34&pid_0008#6&1067c3dc&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"""); Console.WriteLine("\r\nOptions:"); Console.WriteLine(" debug = Print Console statements to Console.Out"); Console.WriteLine("\r\nCMD: will run specified command when button is pressed"); Console.WriteLine("ARG: can be used to specified command arguments"); Console.WriteLine(" Example (open calculator): CMD=calc"); Console.WriteLine(" Example (run Powershell commands): "); Console.WriteLine(" CMD=\"%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe\""); Console.WriteLine(@" ARG=""-Command \""& {write-host 'BEEP!'; [console]::beep(440,1000);}\"""""); Console.WriteLine(" NOTE: use ^& instead of & if running from command prompt as & is special character"); Console.WriteLine("\r\nMACRO: will send specified key sequense to active window via C# Sendkeys"); Console.WriteLine("NOTE: +=Shift, ^=CTRL, %=ALT, ~=Return, use () to group characters."); Console.WriteLine(" Example: MACRO=\"%^g\" (ALT + CTRL + g)"); Console.WriteLine(" Example: MACRO=\"%(asdf)\" (ALT + asdf)"); Console.WriteLine("\r\n"); } if (args.ContainsInsensitive("pause")) { Console.WriteLine("\r\nPress enter to exit..."); Console.ReadLine(); } if (btn != null) { btn.Dispose(); } return 0; } static void DoAction() { count++; Console.WriteLine(String.Format("\r\n{0}: Detected button press event. Count={1}", DateTime.Now.ToLongTimeString(), count)); if (!string.IsNullOrEmpty(strCMD)) { try { Process.Start(strCMD, strCMDARGs); } catch (Exception ex) { Trace.TraceError("Error: " + ex.Message); } } if (!string.IsNullOrEmpty(strMacro)) { try { Console.WriteLine("Sending keys: " + strMacro); System.Windows.Forms.SendKeys.SendWait(strMacro); } catch (Exception ex) { Trace.TraceError("Error: " + ex.Message); } } } } /// /// Extenstions for working with string arrays /// public static class StringArrayExtenstions { public static bool ContainsInsensitive(this string[] args, string name) { return args.Contains(name, StringComparer.CurrentCultureIgnoreCase); } public static IEnumerable StartsWith(this string[] args, string value, StringComparison options = StringComparison.CurrentCultureIgnoreCase) { var q = from a in args where a.StartsWith(value, options) select a; return q; } } }