Как закрыть окно под курсором
От: 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 направить тому, кто под курсором находится.
Подскажите че нить!?
"Производная функции" — со школы не пойму чё это и в какой момент нужно будет применить... :???:
Re: Как закрыть окно под курсором
От: nullptr_t  
Дата: 07.11.10 07:37
Оценка:
Здравствуйте, Business, Вы писали:

а как вы узнали, что мышь попала на чужое окно?
Re[2]: Как закрыть окно под курсором
От: Business  
Дата: 07.11.10 17:14
Оценка:
Здравствуйте, nullptr_t, Вы писали:
_>а как вы узнали, что мышь попала на чужое окно?
// Вычисляет текущую позицию курсора мыши
   [DllImport("user32.dll")]
   [return: MarshalAs(UnmanagedType.Bool)]
   internal static extern Boolean GetCursorPos(out POINT lpPoint);

// Вычисляет Handle окна/элемента_управления под определенным пикселем
   [DllImport("user32.dll")]
   internal static extern IntPtr WindowFromPoint(POINT Point);

Ведь...
Ну и в Windows все называется окнами, даже DeskTopWindow
"Производная функции" — со школы не пойму чё это и в какой момент нужно будет применить... :???:
Re[3]: Как закрыть окно под курсором
От: nullptr_t  
Дата: 07.11.10 19:49
Оценка:
Здравствуйте, Business, Вы писали:

вообщем вот что я скажу, т.к. дрова к моей новой мыши редкостное говно, передо мной стала аналогичная задача, за исключением того что я знаю как её решить (в юзер-моде)
на неделе отпишусь
Re: Как закрыть окно под курсором
От: CEMb  
Дата: 09.11.10 05:02
Оценка:
Здравствуйте, Business, Вы писали:

B>Мне в стандартных утилитах для назначения клавиш мыши не нравится то, что эти программы работают с активным окном. А мне б желательно чтоб при нажатии кнопки мыши (например средней) закрывалось окно под курсором, а не активное.


У меня есть прога, которая закрывает (сворачивает, разворачивает, всё остальное) окна именно под курсором.
Да их много, погугли "mouse manager" например.
Re: Реализовано! Как закрыть окно под курсором
От: Business  
Дата: 29.01.11 15:27
Оценка:
B>Мне в стандартных утилитах для назначения клавиш мыши не нравится то, что эти программы работают с активным окном. А мне б желательно чтоб при нажатии кнопки мыши (например средней) закрывалось окно под курсором, а не активное.

Вот решение:
Cкачать AutoItX3.dll
Прикрепить эту библиотеку к проекту и... ->
using System;
using AutoItX3Lib;
using WinApi;
using System.Runtime.InteropServices;

namespace CloseWindowUnderCursor
{
    class Program
    {
        static void Main()
        {
            AutoItX3 au3 = new AutoItX3();

            String winTitle = User32Advanced.GetWindowTitleUnderCursor();
            if (winTitle.Length == 0)
            {
                au3.MouseClick();
                au3.Send("!{F4}");
            }
            else
                au3.WinClose(winTitle);
        }
    }
}

namespace WinApi
{
    public static class User32Advanced
    {
        private const UInt32 GetRoot = 2U;

        private static IntPtr GetWindowUnderCursor()
        {
            POINT cursorPosition;

            Boolean getCursorPos_Performs = User32.GetCursorPos(out cursorPosition);
            if (!getCursorPos_Performs)
                throw new Exception("Не удалось получить координаты курсора");

            IntPtr controlHandle_UnderCursor = User32.WindowFromPoint(cursorPosition);
            if (controlHandle_UnderCursor == IntPtr.Zero)
                throw new Exception("Не удалось получить хендл контрола под курсором");

            IntPtr window_UnderCursor = User32.GetAncestor(controlHandle_UnderCursor, GetRoot);
            if (window_UnderCursor == IntPtr.Zero)
                throw new Exception("Не удалось получить хендл родительского окна того контрола, который под курсором");

            return window_UnderCursor;
        }
        private static String GetWindowTitle(IntPtr hWnd)
        {
            Int32 length = User32.GetWindowTextLength(hWnd);

            StringBuilder buffer = new StringBuilder(length + 1);
            User32.GetWindowText(hWnd, buffer, buffer.Capacity);

            return buffer.ToString();
        }

        public static String GetWindowTitleUnderCursor()
        {
            IntPtr hwnd = GetWindowUnderCursor();
            String result = GetWindowTitle(hwnd);

            return result;
        }
    }
}

namespace WinApi
{
    internal static class User32
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern Boolean GetCursorPos(out POINT lpPoint);

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

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

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int GetWindowTextLength(IntPtr hWnd);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern Int32 GetWindowText(IntPtr hWnd, StringBuilder lpString, Int32 nMaxCount);
    }
}

namespace WinApi
{
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public Int32 X;
        public Int32 Y;
    }
}
"Производная функции" — со школы не пойму чё это и в какой момент нужно будет применить... :???:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.