11

とを持つWindow要素があるため、タイトル バーがなく、透明度がサポートされています。WindowStyle="None"AllowsTransparency="True"

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

私はこの機能を 1 つの例外を除いて動作させることができました: マウスがウィンドウの外に移動したとき (マウスの左ボタンがウィンドウの端近くで押され、マウスがすばやく動かされたときなど)、ウィンドウはもはやマウスの位置をキャプチャし、マウスと一緒にドラッグしません。

これは、仕事を成し遂げるために使用するコード ビハインドのコードです。

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

3 に答える 3

9

私はあなたがこれを探していると思います: Processing Global Mouse and Keyboard Hooks in C#

URL: 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());
}
于 2012-12-05T21:03:57.847 に答える
6

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

例:

    private void title_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        this.DragMove();
    }
于 2012-12-05T20:45:38.053 に答える
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;
}
于 2013-12-03T20:41:53.650 に答える