Как закрыть окно под курсором
От: Business  
Дата: 06.11.10 22:35
Оценка:
Мне в стандартных утилитах для назначения клавиш мыши не нравится то, что эти программы работают с активным окном. А мне б желательно чтоб при нажатии кнопки мыши (например средней) закрывалось окно под курсором, а не активное.
вот последняя моя разработка на C#:

private const UInt32 GetRoot = 2U;
        private const UInt32 WM_SYSCOMMAND = 0x0112;
        private const UInt32 SC_CLOSE = 0xF060;

        public static void CloseWindowUnderCursor()
        {
            POINT cursorPosition;

            Boolean getCursorPos_Performs = GetCursorPos(out cursorPosition);
            if (!getCursorPos_Performs)
                return;

            IntPtr controlHandle_UnderCursor = WindowFromPoint(cursorPosition);
            IntPtr window_UnderCursor = GetAncestor(controlHandle_UnderCursor, GetRoot);

            SendMessage(window_UnderCursor, WM_SYSCOMMAND, SC_CLOSE, IntPtr.Zero);
        }

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern Boolean GetCursorPos(out POINT lpPoint);

        [DllImport("user32.dll")]
        internal static extern IntPtr WindowFromPoint(POINT Point);

        [DllImport("user32.dll", ExactSpelling = true)]
        internal static extern IntPtr GetAncestor(IntPtr hwnd, UInt32 gaFlags);

        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, IntPtr lParam);

    [StructLayout(LayoutKind.Sequential)]
    internal struct POINT
    {
        public Int32 X;
        public Int32 Y;
    }

Эта версия стабильнее, чем другие, поэтому я на ней и остановился.
Но есть проблемы:
1) Когда я нажимаю кнопку мыши над рабочим столом — пропадают все ярлыки на рабочем столе,,, и все на этом...
2) Иногда в интернет експлорере, программа DownloadMaster предлагает закачать файл.
Другие версии были WM_SYSKEYDOWN, WM_CLOSE — работали с перебоями = отпали!
Сделать активным окно и послать нажатия клавиш клавиатуры SendInput или SendKeys(C#) — Не получалось стабильно сделать окно активным
(пробовал SetFocus, SetForegroundWindow, BringToFront, WM_ACTIVATE)
И в тех и в других случаях либо не правильно на один и тот же алгоритм реагирует Рабочий стол, либо окно, над которым находится курсор
Впринципе, я хочу что-то типа Alt+F4 направить тому, кто под курсором находится.
Подскажите че нить!?
"Производная функции" — со школы не пойму чё это и в какой момент нужно будет применить... :???:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.