public static string Send(string keys, int keydelay, int shiftdelay, int updelay, string pname = null, AdditionalKeyParser additionalkeyparser = null) { if (!keys.HasChars()) { return(""); } string err = ParseKeys(keys, keydelay, shiftdelay, updelay, additionalkeyparser); if (err != "") { return(err); } if (events == null) { return(""); } byte[] oldstate = GetKeyboardState(); Process p = null; IntPtr currentfore = (IntPtr)0; if (pname.HasChars() && !pname.Equals(CurrentWindow, StringComparison.InvariantCultureIgnoreCase) && pname.Length > 0) { p = Process.GetProcessesByName(pname).FirstOrDefault(); if (p != null) { currentfore = BaseUtils.Win32.UnsafeNativeMethods.GetForegroundWindow(); //System.Diagnostics.Debug.WriteLine("Current fore" + currentfore + " " + p.MainWindowHandle); BaseUtils.Win32.UnsafeNativeMethods.SetForegroundWindow(p.MainWindowHandle); } else { return("Process " + pname + " is not running"); } } SendInput(oldstate); if (p != null) { BaseUtils.Win32.UnsafeNativeMethods.SetForegroundWindow(currentfore); } return(""); }
public static string VerifyKeys(string s, AdditionalKeyParser additionalkeyparser = null) { return(ParseKeys(s, 10, 10, 10, additionalkeyparser)); }
private static string ParseKeys(string s, int defdelay, int defshiftdelay, int defupdelay, AdditionalKeyParser additionalkeyparser = null) { if (events != null) { events.Clear(); } //debugevents = null; s = s.Trim(); IntPtr hwnd = (IntPtr)0; while (s.Length > 0) { if (additionalkeyparser != null) // at each major point { Tuple <string, int, string> t = additionalkeyparser.Parse(s); // Allow the parser to sniff the string if (t.Item3 != null) // error condition here, such as no matching key binding { return(t.Item3); } if (t.Item1 != null) // if replace.. (and the parser can return multiple keys) { s = t.Item1 + " " + s.Substring(t.Item2); // its the replace string, followed by the cut out current string } } KMode kmd = KMode.press; int d1 = -1, d2 = -1, d3 = -1; if (s[0] == '[') { s = s.Substring(1); string word = ObjectExtensionsStrings.FirstWord(ref s, new char[] { ']', ',' }); if (!word.InvariantParse(out d1)) { return("Delay not properly given"); } if (s[0] == ',') { s = s.Substring(1); word = ObjectExtensionsStrings.FirstWord(ref s, new char[] { ']', ',' }); if (!word.InvariantParse(out d2)) { return("Second Delay not properly given"); } } if (s[0] == ',') { s = s.Substring(1); word = ObjectExtensionsStrings.FirstWord(ref s, new char[] { ']' }); if (!word.InvariantParse(out d3)) { return("Third Delay not properly given"); } } if (s[0] == ']') { s = s.Substring(1); } else { return("Missing closing ] in delay"); } } if (s[0] == '^' || s[0] == '<') { kmd = KMode.up; s = s.Substring(1); } else if (s[0] == '!' || s[0] == '>') { kmd = KMode.down; s = s.Substring(1); } Keys shift = KeyObjectExtensions.IsShiftPrefix(ref s); Keys ctrl = Keys.None; Keys alt = Keys.None; if (shift == Keys.None || s.StartsWith("+")) { s = s.Skip("+"); alt = KeyObjectExtensions.IsAltPrefix(ref s); if (alt == Keys.None || s.StartsWith("+")) { s = s.Skip("+"); ctrl = KeyObjectExtensions.IsCtrlPrefix(ref s); if (ctrl != Keys.None) { s = s.Skip("+"); } } } bool mainpart = s.Length > 0 && s[0] != ' '; // keydown is d1 or def int keydowndelay = (d1 != -1) ? d1 : defdelay; // if mainpart present, its d2 or defshift. If no main part, its d1 or def shift int shiftdelay = (mainpart) ? (d2 != -1 ? d2 : defshiftdelay) : (d1 != -1 ? d1 : defshiftdelay); // if in up/down mode, its d1 or def up. If its got a main part, its d3/defup. else its d2/defup int keyupdelay = (kmd == KMode.up || kmd == KMode.down) ? (d1 != -1 ? d1 : defupdelay) : (mainpart ? (d3 != -1 ? d3 : defupdelay) : (d2 != -1 ? d2 : defupdelay)); //System.Diagnostics.Debug.WriteLine(string.Format("{0} {1} {2} {3} {4} {5} ", d1, d2, d3, keydowndelay, shiftdelay, keyupdelay)); if (shift != Keys.None) // we already run shift keys here. If we are doing UP, we send a up, else we are doing down/press { AddEvent(new SKEvent(kmd == KMode.up ? BaseUtils.Win32Constants.WM.KEYUP : BaseUtils.Win32Constants.WM.KEYDOWN, shift, shiftdelay)); } if (ctrl != Keys.None) { AddEvent(new SKEvent(kmd == KMode.up ? BaseUtils.Win32Constants.WM.KEYUP : BaseUtils.Win32Constants.WM.KEYDOWN, ctrl, shiftdelay)); } if (alt != Keys.None) { AddEvent(new SKEvent(kmd == KMode.up ? BaseUtils.Win32Constants.WM.SYSKEYUP : BaseUtils.Win32Constants.WM.SYSKEYDOWN, alt, shiftdelay)); } if (mainpart) { if (s.Length == 0) { return("Invalid no characters after shifters"); } bool brackets = ObjectExtensionsStrings.IsPrefix(ref s, "("); while (s.Length > 0) { string word = ObjectExtensionsStrings.FirstWord(ref s, new char[] { ' ', ')' }); Keys key = word.ToVkey(); if (key != Keys.None) { AddMsgsForVK(key, alt != Keys.None && ctrl == Keys.None, keydowndelay, keyupdelay, kmd); //System.Diagnostics.Debug.WriteLine(shift + " " + alt + " " + ctrl + " press " + key.VKeyToString()); } else { while (word.Length > 0) { string ch = new string(word[0], 1); key = ch.ToVkey(); if (key.IsSingleCharName()) { AddMsgsForVK(key, alt != Keys.None && ctrl == Keys.None, keydowndelay, keyupdelay, kmd); //System.Diagnostics.Debug.WriteLine(shift + " " + alt + " " + ctrl + " press " + key.VKeyToString()); word = word.Substring(1); } else { return("Invalid key " + word); } } } if (!brackets) { break; } else if (s.Length > 0 && s[0] == ')') { s = s.Substring(1); break; } } } if (kmd == KMode.press) // only on a press do we release here { if (alt != Keys.None) { AddEvent(new SKEvent(BaseUtils.Win32Constants.WM.SYSKEYUP, alt, keyupdelay)); } if (ctrl != Keys.None) { AddEvent(new SKEvent(BaseUtils.Win32Constants.WM.KEYUP, ctrl, keyupdelay)); } if (shift != Keys.None) { AddEvent(new SKEvent(BaseUtils.Win32Constants.WM.KEYUP, shift, keyupdelay)); } } s = s.Trim(); if (s.Length > 0 && s[0] == ',') // comma can be used between key groups { s = s.Substring(1).TrimStart(); } } return(""); }