Как я могу захватить события мыши, которые происходят за пределами окна (WPF)?
у меня есть Window
элемент, который имеет WindowStyle="None"
и AllowsTransparency="True"
, поэтому он не имеет заголовка и поддерживает прозрачность.
Я хочу, чтобы пользователь мог перемещать окно в любое положение на экране, щелкнув левой кнопкой мыши в любом месте окна и перетаскивание. Окно должно перетаскиваться вместе с мышью до тех пор, пока левая кнопка мыши нажата.
я смог заставить эту функцию работать с одним исключением: когда мышь перемещается за пределы окна (например, когда левая кнопка мыши была нажата рядом с краем окна и мышь перемещается quicly), окно больше не захватывает позицию мыши и не перетаскивает вместе с мышью.
вот код из кода, который я использую, чтобы выполнить работу:
public Point MouseDownPosition { get; set; }
public Point MousePosition { get; set; }
public bool MouseIsDown { get; set; }
private void window_MyWindowName_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MouseDownPosition = e.GetPosition(null);
MouseIsDown = true;
}
private void window_MyWindowName_MouseMove(object sender, MouseEventArgs e)
{
if (MouseIsDown)
{
MousePosition = e.GetPosition(null);
Left += MousePosition.X - MouseDownPosition.X;
Top += MousePosition.Y - MouseDownPosition.Y;
}
}
private void window_MyWindowName_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
MouseIsDown = false;
}
3 ответов
Я считаю, что вы изобретаете колесо. Поиск "окна.DragMove".
пример:
private void title_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
Я думаю, вы ищете это: обработка глобальных Крючков мыши и клавиатуры в C#
Url:обработка глобальных Крючков мыши и клавиатуры в C#
этот класс позволяет вам нажимать клавиатуру и мышь и / или обнаруживать их активность, даже если приложение работает в фоновом режиме или вообще не имеет пользовательского интерфейса.
этот класс вызывает общие события .NET с KeyEventArgs и MouseEventArgs, поэтому вы можете легко получить любые вам нужна информация.
есть пример и объяснить и демо использовать.
большой учебник!
пример:
UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
actHook= new UserActivityHook(); // crate an instance
// hang on events
actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}
теперь пример того, как обрабатывать событие:
public void MouseMoved(object sender, MouseEventArgs e)
{
labelMousePosition.Text=String.Format("x={0} y={1}", e.X, e.Y);
if (e.Clicks>0) LogWrite("MouseButton - " + e.Button.ToString());
}
попробуйте так:
// method to convert from 'old' WinForms Point to 'new' WPF Point structure:
public System.Windows.Point ConvertToPoint(System.Drawing.Point p)
{
return new System.Windows.Point(p.X,p.Y);
}
// some locals you will need:
bool mid = false; // Mouse Is Down
int x=0, y=0;
// Mouse down event
private void MainForm_MouseDown(object sender, MouseButtonEventArgs e)
{
mid=true;
Point p = e.GetPosition(this);
x = (int)p.X;
y = (int)p.Y;
}
// Mouse move event
private void MainForm_MouseMove(object sender, MouseButtonEventArgs e)
{
if(mid)
{
int x1 = e.GetPosition(this).X;
int y1 = e.GetPosition(this).Y;
Left = x1-x;
Top = y1-y;
}
}
// Mouse up event
private void MainForm_MouseUp(object sender, MouseButtonEventArgs e)
{
mid = false;
}