2

現在、最初にクリックしたときにマウス ボタンを押したままにし、ユーザーがマウス ボタンを 2 回押すまで押し続けるプログラムを作成しています。

このプログラムは、MouseHookListenerを使用して入力をグローバルに検出し、入力シミュレーターを使用して、押されたマウス ボタンを押したままにします。

プログラムは意図したとおりにマウスを押したままにすることができますが、押したままのボタンをシミュレートするようにプログラムに信号を送る元のマウス クリックに問題があります。それはまだ実行されます。MouseHookListener が低レベルのフックを使用して動作することは知っていますが、HookCallBack() メソッドは保護されているためオーバーライドできません。

元のマウス入力をブロックする方法はありますか? または、マウスがもう一度クリックされるまで元の入力を保持する方法はありますか?

これは、これまでに作成したコードです (注 - mListener は他のフォーラムでアクティブ化されています):

    public MouseHold()
    {
        mListener = new MouseHookListener(new GlobalHooker());
        mListener.MouseClick += mListener_MouseClick;
    }

    private bool isDown;
    private int count = 0;
    private InputSimulator sim = new InputSimulator();

    public MouseHookListener mListener;        

    private void mListener_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            if (isDown)
            {
                isDown = false;                    
                Console.Out.WriteLine(count);
            }

            else
            {
                Console.Out.WriteLine(count);
                isDown = true;
                sim.Mouse.LeftButtonDown();

            }
        }
    }
4

2 に答える 2

2

私はあなたが言及したライブラリの作者ですhttps://github.com/gmamaladze/globalmousekeyhook .

ユースケースを有効にするために、ライブラリをもう 1 つのイベントで拡張しました。新しいバージョンではリスナーの構造も少し変更されていることに注意してください。

以下の例では、ライブラリを使用せずにシナリオを達成できると信じていますInputSimulator

使い方?

  1. 最初のマウスダウンがフラグを設定しますm_SupressNextUp- ダウンが発生します。
  2. 前のダウンに続くマウスボタンのアップが抑制され、フラグが設定されますm_SupressNextDown
  3. セカンドダウンも抑えてフラグリセットm_SupressNextUp
  4. セカンドアップが発射され、リセットされますm_SupressNextDown
  5. システムは初期状態に戻ります。

internal class Sample
{
    private IKeyboardMouseEvents m_GlobalHook;
    private bool m_SupressNextUp;
    private bool m_SupressNextDown;

    public void Subscribe()
    {
        m_GlobalHook = Hook.GlobalEvents();

        m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
        m_GlobalHook.MouseUpExt += GlobalHook_MouseUpExt;
    }

    void GlobalHook_MouseUpExt(object sender, MouseEventExtArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (m_SupressNextUp)
            {
                Console.WriteLine(@"First mouse up supress.");
                e.Handled = true;
                m_SupressNextDown = true;
            }
            else
            {
                Console.WriteLine(@"Second mouse up - make it heppen.");
                m_SupressNextDown = false;
            }
        }
    }

    private void GlobalHookMouseDownExt(object sender, MouseEventExtArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (m_SupressNextDown)
            {
                Console.WriteLine(@"Second mouse down supress.");
                e.Handled = true;
                m_SupressNextUp = false;
            }
            else
            {
                Console.WriteLine(@"First mouse down - make it heppen.");
                m_SupressNextUp = true;
            }
        }
    }

    public void Unsubscribe()
    {
        m_GlobalHook.MouseDownExt -= GlobalHookMouseDownExt;
        m_GlobalHook.MouseUpExt -= GlobalHook_MouseUpExt;

        m_GlobalHook.Dispose();
    }
}
于 2015-05-18T09:29:05.423 に答える
0

入力シミュレーターのドキュメントを確認した後、マウスダウン入力を逆にする必要があると推測しています。

入力シミュレータのソースコードにはマウスアップメソッドがあります

    private void mListener_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        if (isDown)
        {
            isDown = false;                    
            Console.Out.WriteLine(count);
            sim.Mouse.LeftButtonUp(); //maybe try this
        }

        else
        {
            Console.Out.WriteLine(count);
            isDown = true;
            sim.Mouse.LeftButtonDown();

        }
    }
}
于 2015-05-05T20:20:00.057 に答える