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);