7

マウスをドラッグするだけでフォームの境界の外にカーソルの位置を取得するのは非常に簡単です。位置が変更されるたびに、次のコード行から多くの値がフォームに送信されます。

MessageBox.Show(Cursor.Position.ToString());

マウスの位置を示すメッセージ ボックス。

しかし、ユーザーがフォームの境界の外をクリックしたときにマウスの位置を取得する必要があります。マウスをホバリングするだけではありません。これを行うには、次のコード行を使用しました。

private void Form1_Deactivate(object sender, EventArgs e)
{
    MessageBox.Show(Cursor.Position.ToString());
}

MessageBox.Show(Cursor.Position.ToString());を配置しました。フォームに Deactivate イベント。ユーザーがフォームの外側をクリックすると、このイベントが確実に発生します。ただし、ユーザーが外側をクリックせずにALT + TABキーの組み合わせを使用してプログラムを変更すると、間違った値も送信されます。

実際には、最初のクリックの位置から始まる領域のスクリーン ショットをキャプチャする必要があります。したがって、フォームの外でクリックしたときのカーソルの位置が必要です。お気に入り: ここに画像の説明を入力

4

5 に答える 5

11

これは誰かを助けるかもしれません。

ここではWindows.Forms.Timer、[X および Y] カーソル位置を表示するための 2 つのテキスト ボックスを使用しています。タイマーティックで APIGetCursorPosを呼び出し、カーソル位置を取得します。

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern bool GetCursorPos(ref Point lpPoint);

    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        var pt = new Point();

        GetCursorPos(ref pt);
        textBox1.Text = pt.X.ToString();
        textBox2.Text = pt.Y.ToString();
    }   
}

よろしく、ランジート。

于 2011-10-04T13:26:50.887 に答える
8

Global Mouse Hookこれを行うには、ロジックを使用する必要があります。

これがあなたを助ける良い記事です:C#でのグローバルマウスとキーボードフックの処理

于 2011-04-03T09:06:11.630 に答える
1

この問題の解決策は簡単です。必要なのは であり、 user32.dll からメソッドを抽出するためにSystem.Windows.Forms.Timer使用します。System.Runtime.InteropService.DllImportGetKeyState

この関数には、任意の型の整数の 1 つのパラメーターがあり、short (Int16) を返します。この関数は、フォームに依存するのではなく、いつでもどこでも、いくつかのキーが押されたかどうかを知ることができます。タイマーが有効になっている間、マウスの位置がフォームの境界から外れているかどうかを確認できます。マウスの位置を取得する方法はたくさんあります。

1つの方法は、、Cursor.PositionまたはControl.MousePosition、またはexternメソッドであるboolを使用しGetCursorPos(ref Point lpPoint)て、「user32.dll」からDllImportできることです。form.Bounds または form.ClientRectangle、または form.Location および form.Size または form.Left および form.Top および form.Width および form.Height、これらすべてがフォームの境界をもたらします。timer_Tick 関数イベントでは、たとえば次のコードを記述します。

var mp = Cursor.Position;
var fb = form.ClientRectangle; // Or form.Bounds

if (mp.X < fb.X || mp.Y < fb.Y || mp.X > fb.X + fb.Width || mp.Y > fb.Y + fb.Height)
{
    // Use GetKeyState from user32.dll to detect if at least 1 key is pressed
    // (look at internet how to do it exactly)
    // If yes MessageBox.Show("Clicked outside");
}

少なくとも 1 つのキーが押された場合は、メッセージを で表示しますMessageBox。私が前に話したこれらすべてのことを行う方法をインターネットで読むことができます。成功すれば、うまくいくでしょう!

于 2013-06-25T08:32:42.230 に答える
0

非アクティブ化イベントは、フォームがアクティブでなくなったことをフォームに通知します。それは多くの理由で起こる可能性があります。

通常、ウィンドウは、マウスがこのウィンドウ上にある場合にのみマウスイベントを取得します。SetCapture関数を使用すると、すべてのマウスイベントを取得できます(.NETの対応するものはわかりません)。マウスイベントをキャプチャできるウィンドウは1つだけなので、必要がない場合はマウスイベントをキャプチャしないでください。質問には、実際に何をしたいのか、ユーザーがフォームの外をクリックしたときになぜ知る必要があるのか​​についての十分な詳細がありません。

于 2011-04-03T09:09:19.790 に答える