2012-12-05 12 views
9

Mam element Window, który ma WindowStyle="None" i AllowsTransparency="True", dlatego nie ma paska tytułu i obsługuje przezroczystość.Jak mogę przechwytywać zdarzenia myszy, które występują poza oknem (WPF)?

Chcę, aby użytkownik mógł przesunąć okno do dowolnej pozycji na ekranie, klikając lewym przyciskiem myszy w dowolnym miejscu w oknie i przeciągając. Okno powinno przeciągać razem z myszą tak długo, jak wciśnięty jest lewy przycisk myszy.

Udało mi się uruchomić tę funkcjonalność z jednym wyjątkiem: gdy mysz porusza się poza Oknem (np. Gdy lewy przycisk myszy został naciśnięty w pobliżu krawędzi okna, a mysz jest przenoszona szybko), okno nie przechwytuje już pozycji myszy i nie przeciąga razem z myszą.

Oto kod z kodu źródłowego, że mogę używać, aby uzyskać zadanie:

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; 
} 

Odpowiedz

6

wierzę jesteś wyważania otwartych drzwi. Wyszukaj "Window.DragMove".

Przykład:

private void title_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     this.DragMove(); 
    } 
9

myślę szukasz to: tworzenie globalnego mysz i klawiatura Haki w C#

Url: Processing Global Mouse and Keyboard Hooks in C#

Klasa ta pozwala wykorzystać klawiaturę i mysz oraz/lub wykrycia ich aktywności, nawet jeśli aplikacja działa w tle lub nie ma w ogóle żadnego interfejsu użytkownika.

Ta klasa gromadzi typowe zdarzenia .NET z KeyEventArgs i MouseEventArgs, dzięki czemu można łatwo odzyskać wszelkie potrzebne informacje.

Istnieje przykład i wyjaśnij i użyj wersji demonstracyjnej.

Świetny samouczek!

Przykład:

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); 
} 

Teraz przykładem jak przetwarzać zdarzenia:

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()); 
} 
0

Wypróbuj go w ten sposób:

// 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; 
} 
Powiązane problemy