Description of ClickSettings.
        protected internal bool ClickControl(HasControlInputCmdletBase cmdlet,
                                    IUiElement element,
                                    ClickSettings settings)
        {
            bool result = false;
            
            if (-1000000 == settings.RelativeX) {
                settings.RelativeX = Preferences.ClickOnControlByCoordX;
            }
            if (-1000000 == settings.RelativeY) {
                settings.RelativeY = Preferences.ClickOnControlByCoordY;
            }
            
            IUiElement whereToClick = 
                element;
            IUiElement whereTheHandle = 
                whereToClick;
            
            // 20140312
            // if (whereToClick.Current.NativeWindowHandle == 0) {
            if (whereToClick.GetCurrent().NativeWindowHandle == 0) {
                
                whereTheHandle =
                    whereToClick.GetAncestorWithHandle();
                // 20140312
                // if (whereTheHandle.Current.NativeWindowHandle == 0) {
                if (whereTheHandle.GetCurrent().NativeWindowHandle == 0) {
                    
                    WriteError(
                        this,
                        "The handle of this control equals to zero",
                        "ZeroHandle",
                        ErrorCategory.InvalidArgument,
                        true);

                    // TODO: WriteError(...)
                } else {
//                    WriteVerbose(cmdlet, 
//                                 "the control with a handle is " + 
//                                 whereTheHandle.Current.Name);
//                    WriteVerbose(cmdlet, 
//                                 "its handle is " + 
//                                 whereTheHandle.Current.NativeWindowHandle.ToString());
//                    WriteVerbose(cmdlet, 
//                                 "its rectangle is " + 
//                                 whereTheHandle.Current.BoundingRectangle.ToString());
                }
            }
            
            int x = 0;
            int y = 0;
            // these x and y are window-related coordinates
            if (settings.RelativeX != 0 && settings.RelativeY != 0) {
                // 20140312
//                x = settings.RelativeX + (int)whereToClick.Current.BoundingRectangle.X;
//                y = settings.RelativeY + (int)whereToClick.Current.BoundingRectangle.Y;
                x = settings.RelativeX + (int)whereToClick.GetCurrent().BoundingRectangle.X;
                y = settings.RelativeY + (int)whereToClick.GetCurrent().BoundingRectangle.Y;
            } else {
                // these x and y are for the SetCursorPos call
                // they are screen coordinates
                // 20140312
//                x = (int)whereToClick.Current.BoundingRectangle.X + 
//                    ((int)whereToClick.Current.BoundingRectangle.Width / 2); // + 3;
//                y = (int)whereToClick.Current.BoundingRectangle.Y + 
//                    ((int)whereToClick.Current.BoundingRectangle.Height / 2); // + 3;
                x = (int)whereToClick.GetCurrent().BoundingRectangle.X + 
                    ((int)whereToClick.GetCurrent().BoundingRectangle.Width / 2); // + 3;
                y = (int)whereToClick.GetCurrent().BoundingRectangle.Y + 
                    ((int)whereToClick.GetCurrent().BoundingRectangle.Height / 2); // + 3;
            }
            // if the -X and -Y paramters are supplied (only for SetCursorPos)
            
            // PostMessage's (click) second parameter
            uint uDown = 0;
            uint uUp = 0;
            
            // these relative coordinates for SendMessage/PostMessage
            // 20140312
//            settings.RelativeX = x - (int)whereTheHandle.Current.BoundingRectangle.X;
//            settings.RelativeY = y - (int)whereTheHandle.Current.BoundingRectangle.Y;
            settings.RelativeX = x - (int)whereTheHandle.GetCurrent().BoundingRectangle.X;
            settings.RelativeY = y - (int)whereTheHandle.GetCurrent().BoundingRectangle.Y;
            
            // PostMessage's (click) third and fourth paramters (the third'll be reasigned later)
            IntPtr wParamDown = IntPtr.Zero;
            IntPtr wParamUp = IntPtr.Zero;
            var lParam =
                new IntPtr(((new IntPtr(settings.RelativeX)).ToInt32() & 0xFFFF) +
                           (((new IntPtr(settings.RelativeY)).ToInt32() & 0xFFFF) << 16));
            
            /*
            IntPtr lParam = 
                new IntPtr(((new IntPtr(settings.RelativeX)).ToInt32() & 0xFFFF) +
                           (((new IntPtr(settings.RelativeY)).ToInt32() & 0xFFFF) << 16));
            */
            
            // PostMessage's (keydown/keyup) fourth parameter
            const uint uCtrlDown = 0x401D;
            const uint uCtrlUp = 0xC01D;
            const uint uShiftDown = 0x402A;
            const uint uShiftUp = 0xC02A;
            IntPtr lParamKeyDown = IntPtr.Zero;
            IntPtr lParamKeyUp = IntPtr.Zero;
            
            if (settings.Ctrl) {
                lParamKeyDown = 
                    new IntPtr(((new IntPtr(0x0001)).ToInt32() & 0xFFFF) +
                               (((new IntPtr(uCtrlDown)).ToInt32() & 0xFFFF) << 16));
                lParamKeyUp = 
                    new IntPtr(((new IntPtr(0x0001)).ToInt32() & 0xFFFF) +
                               (((new IntPtr(uCtrlUp)).ToInt32() & 0xFFFF) << 16));
            }
            if (settings.Shift) {
                lParamKeyDown = 
                    new IntPtr(((new IntPtr(0x0001)).ToInt32() & 0xFFFF) +
                               (((new IntPtr(uShiftDown)).ToInt32() & 0xFFFF) << 16));
                lParamKeyUp = 
                    new IntPtr(((new IntPtr(0x0001)).ToInt32() & 0xFFFF) +
                               (((new IntPtr(uShiftUp)).ToInt32() & 0xFFFF) << 16));
            }
            // PostMessage's (activate) third parameter
            uint ulAct = 0;
            uint uhAct = 0;
            
            uint mask = 0;
            if (settings.Ctrl) {
                mask |= NativeMethods.MK_CONTROL;
            }
            if (settings.Shift) {
                mask |= NativeMethods.MK_SHIFT;
            }
            
            if (settings.RightClick && !settings.DoubleClick) {
                uhAct = uDown = NativeMethods.WM_RBUTTONDOWN;
                uUp = NativeMethods.WM_RBUTTONUP;
                wParamDown = new IntPtr(NativeMethods.MK_RBUTTON | mask);
                wParamUp = new IntPtr(mask);
                ulAct = NativeMethods.MK_RBUTTON;
            } else if (settings.RightClick && settings.DoubleClick) {
                uhAct = uDown = NativeMethods.WM_RBUTTONDBLCLK;
                uUp = NativeMethods.WM_RBUTTONUP;
                wParamDown = new IntPtr(NativeMethods.MK_RBUTTON | mask);
                wParamUp = new IntPtr(mask);
                ulAct = NativeMethods.MK_RBUTTON;
            } else if (settings.MidClick && !settings.DoubleClick) {
                uhAct = uDown = NativeMethods.WM_MBUTTONDOWN;
                uUp = NativeMethods.WM_MBUTTONUP;
                wParamDown = new IntPtr(NativeMethods.MK_MBUTTON | mask);
                wParamUp = new IntPtr(mask);
                ulAct = NativeMethods.MK_MBUTTON;
            } else if (settings.MidClick && settings.DoubleClick) {
                uhAct = uDown = NativeMethods.WM_MBUTTONDBLCLK;
                uUp = NativeMethods.WM_MBUTTONUP;
                wParamDown = new IntPtr(NativeMethods.MK_MBUTTON | mask);
                wParamUp = new IntPtr(mask);
                ulAct = NativeMethods.MK_MBUTTON;
            } else if (settings.DoubleClick) {
                uhAct = uDown = NativeMethods.WM_LBUTTONDBLCLK;
                uUp = NativeMethods.WM_LBUTTONUP;
                wParamDown = new IntPtr(NativeMethods.MK_LBUTTON | mask);
                wParamUp = new IntPtr(mask);
                ulAct = NativeMethods.MK_LBUTTON;
            } else {
                uhAct = uDown = NativeMethods.WM_LBUTTONDOWN;
                uUp = NativeMethods.WM_LBUTTONUP;
                wParamDown = new IntPtr(NativeMethods.MK_LBUTTON | mask);
                wParamUp = new IntPtr(mask);
                ulAct = NativeMethods.MK_LBUTTON;
            }
            
            // 20140312
            // var handle = new IntPtr(whereTheHandle.Current.NativeWindowHandle);
            var handle = new IntPtr(whereTheHandle.GetCurrent().NativeWindowHandle);
            /*
            IntPtr handle =
                    new IntPtr(whereTheHandle.Current.NativeWindowHandle);
            */
            
            try {
                whereTheHandle.SetFocus();
            } 
            catch { }
            
            bool setCursorPosResult = 
                NativeMethods.SetCursorPos(x, y);
//            WriteVerbose(cmdlet, "SetCursorPos result = " + setCursorPosResult.ToString());
            
            Thread.Sleep(Preferences.OnClickDelay);
            
            // trying to heal context menu clicks
            Process windowProcess = 
                Process.GetProcessById(
                    // 20140312
                    // whereTheHandle.Current.ProcessId);
                    whereTheHandle.GetCurrent().ProcessId);
            if (windowProcess != null) {
                IntPtr mainWindow = 
                    windowProcess.MainWindowHandle;
                if (mainWindow != IntPtr.Zero) {
                    
                    var lParam2 = 
                        new IntPtr(((new IntPtr(ulAct)).ToInt32() & 0xFFFF) +
                                   (((new IntPtr(uhAct)).ToInt32() & 0xFFFF) << 16));
                    /*
                    IntPtr lParam2 = 
                        new IntPtr(((new IntPtr(ulAct)).ToInt32() & 0xFFFF) +
                                   (((new IntPtr(uhAct)).ToInt32() & 0xFFFF) << 16));
                    */
                    bool res0 = 
                        NativeMethods.PostMessage1(handle, NativeMethods.WM_MOUSEACTIVATE, 
                                     mainWindow, lParam2);
//                    WriteVerbose(this, "WM_MOUSEACTIVATE is sent");
                }
            }
            
            if (settings.Ctrl) {
                // press the control key
                NativeMethods.keybd_event((byte)NativeMethods.VK_LCONTROL, 0x45, NativeMethods.KEYEVENTF_EXTENDEDKEY | 0, 0);
//                WriteVerbose(this, " the Control button has been pressed");
            }
            if (settings.Shift) {
                // press the settings.Shift key
                NativeMethods.keybd_event((byte)NativeMethods.VK_LSHIFT, 0x45, NativeMethods.KEYEVENTF_EXTENDEDKEY | 0, 0);
//                WriteVerbose(this, " the Shift button has been pressed");
            }
            
            // // 20120620 for Home Tab
            bool res1 = NativeMethods.PostMessage1(handle, uDown, wParamDown, lParam);
            
            int interval = settings.DoubleClickInterval / 2;
            if (settings.DoubleClick) {
                Thread.Sleep(interval);
            }
            
            // MouseMove
            if (settings.RightClick || settings.DoubleClick) {
                bool resMM = NativeMethods.PostMessage1(handle, NativeMethods.WM_MOUSEMOVE, wParamDown, lParam);
            }
            
            // 20131125
            if (settings.DoubleClick) {
                Thread.Sleep(interval);
            }
            
            // // 20120620 for Home Tab
            bool res2 = NativeMethods.PostMessage1(handle, uUp, wParamUp, lParam);
            
            if (!settings.inSequence) {
                if (settings.Ctrl) {
                    // release the control key
                    NativeMethods.keybd_event((byte)NativeMethods.VK_LCONTROL, 0x45, NativeMethods.KEYEVENTF_EXTENDEDKEY | NativeMethods.KEYEVENTF_KEYUP, 0);
//                    WriteVerbose(this, " the Control button has been released");
                }
                if (settings.Shift) {
                    // release the settings.Shift key
                    NativeMethods.keybd_event((byte)NativeMethods.VK_LSHIFT, 0x45, NativeMethods.KEYEVENTF_EXTENDEDKEY | NativeMethods.KEYEVENTF_KEYUP, 0);
//                    WriteVerbose(this, " the Shift button has been released");
                }
            }
            
//            WriteVerbose(cmdlet,
//                         // // 20120620 for Home Tab
//                         // 20130312
//                         "PostMessage " + uDown.ToString() + 
//                         //"SendMessage " + uDown.ToString() + 
//                         " result = " + res1.ToString());
//            WriteVerbose(cmdlet, 
//                         // // 20120620 for Home Tab
//                         // 20130312
//                         "PostMessage " + uUp.ToString() +
//                         //"SendMessage " + uUp.ToString() + 
//                         " result = " + res2.ToString());
            // if (!res1 && !res2) {
            if (res1 && res2) {
                result = true;
            } else {
                result = false;
            }
            
            return result;
        }