public override void Do() { var keys = new List <Keys>(); if (ModifiersMask.HasFlag(KeyModifiers.Control) && !Hook.ActiveModifiers.HasFlag(KeyModifiers.Control)) { keys.Add(Keys.LControlKey); } if (ModifiersMask.HasFlag(KeyModifiers.Shift) && !Hook.ActiveModifiers.HasFlag(KeyModifiers.Shift)) { keys.Add(Keys.LShiftKey); } if (ModifiersMask.HasFlag(KeyModifiers.Alt) && !Hook.ActiveModifiers.HasFlag(KeyModifiers.Alt)) { keys.Add(Keys.LMenu); } keys.Add(Key); if (string.IsNullOrEmpty(FocusProcessName)) { foreach (var key in keys) { SimulateKey(key, true, false); } foreach (var key in keys.Reverse <Keys>()) { SimulateKey(key, false, true); } } else { var foregroundWindow = HookAPI.GetForegroundWindow(); var processes = Process.GetProcessesByName(FocusProcessName); if (processes.Length == 0) { return; } var parents = processes.Select(it => ParentProcessUtilities.GetParentProcess(it.Id)).Where(it => it != 0); var mains = processes.Where(it => parents.Contains(it.Id)).ToList(); foreach (var parent in mains) { if (parent.MainWindowHandle == null) { continue; } HookAPI.SetForegroundWindow(parent.MainWindowHandle); Thread.Sleep(200); foreach (var key in keys) { SimulateKey(key, true, false); } foreach (var key in keys.Reverse <Keys>()) { SimulateKey(key, false, true); } if (FirstOnly) { break; } } if (foregroundWindow != IntPtr.Zero) { HookAPI.SetForegroundWindow(foregroundWindow); } } }
private static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref ParentProcessUtilities processInformation, int processInformationLength, out int returnLength);