Подскажите, пожалуйста, каким образом можно получить сведения об элементе управления расположенном в каких-то конкретных координатах экрана.
Задача стоит чтобы перехватывая события мыши (скажем, клик) можно было определить какая кнопка (и какому окну принадлежащая) была нажата.
Если кто в курсе, необходимо сделать приложение наподобие AutoIt.
Или такие задачи решаются глобальным перехватом сообщений WM_COMMAND и последующим разбором где и что было сделано? Интересует решение для контролов .NET и стандартных win32, если есть отличие в этом.
Также потом будет необходимо воспроизводить события, т.е. по записанным параметрам (скажем, caption кнопки) выполнять действия пользователя.
> каким образом можно получить сведения об элементе управления расположенном в каких-то конкретных координатах экрана.
Задача стоит чтобы перехватывая события мыши (скажем, клик) можно было определить какая кнопка (и какому окну принадлежащая) была нажата.
События мыши перехватываются с помощью Global Mouse Hook (на сайте есть примеры, но почему-то глобальный хук под дебагером не работает)
Чтобы найти контрол под курсором:
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point point);
[DllImport("user32.dll")]
private static extern bool GetCursorPos(out Point position);
Point position;
GetCursorPos(out position);
IntPtr hwnd = WindowFromPoint(position);
Control c = Control.FromHandle(hwnd);
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, Varg, Вы писали:
V>[DllImport("user32.dll")]
V>private static extern bool GetCursorPos(out Point position);
А чем Cursor.Position не устроил?
public static Point Position
{
get
{
System.Windows.Forms.NativeMethods.POINT point1 = new System.Windows.Forms.NativeMethods.POINT();
System.Windows.Forms.UnsafeNativeMethods.GetCursorPos(point1);
return new Point(point1.x, point1.y);
}
... << RSDN@Home 1.1.4 beta 7 rev. 499>>
Varg, сделал как вы сказали. Но Control.FromHandle(hwnd) работает только для окон внутри моего приложения, если же запрашивается какое-то внешнее окно, то оно не возвращает контрола. Здесь какие-то фишки с безопасностью?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
> Control.FromHandle(hwnd) работает только для окон внутри моего приложения, если же запрашивается какое-то внешнее окно, то оно не возвращает контрола. Здесь какие-то фишки с безопасностью?
скорее всего, что да.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
оказывается дело не в безопасности, а в том, что в глубинах вызова Control.FromHandle определяется следующее: если hwnd не был ранее сохранен в private static массиве (определен в классе NativeWindow), то метод Control.FromHandle вернет null.
У каждого приложения свой private static массив.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение