2012-12-05 34 views
9

WindowStyle="None"AllowsTransparency="True"を持つWindow要素があるため、タイトルバーがなく、透過性をサポートしています。(WPF)ウィンドウの外で発生するマウスイベントをキャプチャする方法はありますか?

ウィンドウ内の任意の場所を左クリックしてドラッグすると、画面上の任意の位置にウィンドウを移動できるようにしたいと考えています。左マウスボタンが押されている限り、ウィンドウはマウスと共にドラッグする必要があります。

マウスをウィンドウの外側に移動したとき(マウスの左ボタンをウィンドウの端に近づけてマウスをきれいに動かしたときなど)、この機能が動作するようになりました。ウィンドウはマウスの位置をキャプチャしなくなり、マウスと共にドラッグしません。ここで

は、私が仕事を得るために使用するコードビハインドからのコードです:

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

答えて

6

私はあなたが車輪の再発明していると信じています。 「Window.DragMove」を検索します。

例:

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

私はあなたがこのために探していると思う:C#での処理グローバルマウスとキーボードフック

URL:Processing Global Mouse and Keyboard Hooks in C#

このクラスを使用すると、キーボードとマウスをタップすることができますし、アプリケーションがバックグラウンドで実行されている場合やユーザーインターフェイスがまったくない場合でも、アクティビティを検出することができます。

このクラスは、KeyEventArgsおよびMouseEventArgsで一般的な.NETイベントを発生させるので、必要な情報を簡単に取得できます。

使用例と説明とデモがあります。

偉大なチュートリアル!

例:今すぐ

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

このようにそれを試してみてください。

// 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; 
} 
関連する問題