#c# #mouse
#c# #мышь
Вопрос:
Я построил движение мыши, которое я нашел, но я не хочу, чтобы программа автоматически нажимала на объекты, а вместо этого показывала мне, где нажимать. Как мне это сделать?
(Новичок, начал C # и C около четырех месяцев назад!)
Редактировать: Чтобы пояснить, программа предназначена для нажатия на другое окно, а не на саму себя (своего рода макрос, вот почему я хочу, чтобы опция просто отображалась, чтобы пользователь мог видеть, для чего была создана программа!)
Комментарии:
1. Вам нужно разработать способ указать, что на элемент управления следует щелкнуть. Это может означать обертывание каждого из ваших элементов управления в декораторе, который каким-то образом выделяет его. Насколько я знаю, в ней нет ничего встроенного, поэтому ответ таков: «напишите код, который заставит приложение показать вам, куда нажимать»…
2. Понятно, спасибо. Я еще не научился делать те вещи, о которых вы упомянули, но я изучу это!
Ответ №1:
Предполагая, что вы используете WinForms, вот краткий пример. «Цель» в этом случае оказывается в той же форме, но вы можете передать hWnd во внешнее окно, и оно должно работать так же. Вам нужно сохранить ссылку на наложение, чтобы вы могли закрыть его позже; это то, что делает вторая кнопка. Очевидно, что в вашем приложении вам придется делать это по-другому, но это только начало:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
OverlayForm overlay = null;
private void button1_Click(object sender, EventArgs e)
{
if (overlay == null)
{
overlay = new OverlayForm(button2.Handle); // <-- pass in an hWnd to some external window
overlay.Show();
}
}
private void button2_Click(object sender, EventArgs e)
{
if (overlay != null)
{
overlay.Close();
overlay = null;
}
}
}
public class OverlayForm : Form
{
private IntPtr ExternalhWnd;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
}
public OverlayForm(IntPtr ExternalhWnd)
{
this.ExternalhWnd = ExternalhWnd;
this.TopMost = true;
this.ShowInTaskbar = false;
this.FormBorderStyle = FormBorderStyle.None;
this.StartPosition = FormStartPosition.Manual;
this.Opacity = 0.7; // 70% opacity
this.BackColor = Color.Yellow;
}
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT - Ignore Mouse Clicks
createParams.ExStyle |= 0x80; // WS_EX_TOOLWINDOW - Remove from Alt-Tab List
return createParams;
}
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
if (!this.ExternalhWnd.Equals(IntPtr.Zero))
{
// position our overlay on top of the external window
RECT rct;
GetWindowRect(this.ExternalhWnd, out rct);
this.Location = new Point(rct.Left, rct.Top);
this.Size = new Size(rct.Right - rct.Left, rct.Bottom - rct.Top);
}
}
}
Вот изображение формы до и после нажатия кнопки 1:
Кнопка 2 по-прежнему реагирует на ввод пользователя и щелкает при наличии желтого наложения.
Задавайте столько вопросов, сколько хотите, чтобы понять код и реализовать его в своем проекте. Я сделаю все возможное, чтобы помочь вам…
Комментарии:
1. Спасибо, что нашли время ответить на этот вопрос. Я собираюсь отметить это как правильный ответ, поскольку я новичок, и я изучу ваш код и применю его! Спасибо!