Мне в стандартных утилитах для назначения клавиш мыши не нравится то, что эти программы работают с активным окном. А мне б желательно чтоб при нажатии кнопки мыши (например средней) закрывалось окно под курсором, а не активное.
вот последняя моя разработка на 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 направить тому, кто под курсором находится.
Подскажите че нить!?
Здравствуйте, 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
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;
}
}