簡體   English   中英

如何檢測鼠標點擊?

[英]How to detect mouse clicks?

如何在Windows上檢測鼠標點擊? (XP / Vista / 7的)。 例如,當我的應用程序運行時,它將檢測用戶是否點擊某些內容(不在該應用程序UI上,而是在Windows UI上)。 如果是,則執行另一個進程。

我不知道這是否可能,我希望有人可以給我一些指導。

謝謝!

如果要攔截任何鼠標點擊,移動,鼠標滾輪點擊等,您需要編寫鼠標掛鈎。

如果您想在自己的應用程序之外跟蹤鼠標活動,這是AFAIK的唯一方法。 如果要安裝掛鈎,則需要從User32.dll文件導入SetWindowsHookEx(...)函數。 它涉及互操作(PInvoke),你必須導入(DllImport)一些函數。

以下是Microsoft關於如何在C#中實現此目的的官方文檔:

如何在Visual C#.NET中設置Windows掛鈎

我將在這里總結一下,如果鏈接有一天會死,那么答案就完整了。

從SetWindowsHookEx函數開始:

[DllImport("user32.dll",CharSet=CharSet.Auto,
 CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, 
IntPtr hInstance, int threadId);

現在你可以設置你的鈎子了。 例如:

public class Form1
{
    static int hHook = 0;
    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
    HookProc MouseHookProcedure;

    private void ActivateMouseHook_Click(object sender, System.EventArgs e)
    {
        if(hHook == 0)
        {
            MouseHookProcedure = new HookProc(Form1.MouseHookProc);
            hHook = SetWindowsHookEx(WH_MOUSE, 
                             MouseHookProcedure,
                             (IntPtr) 0,
                             AppDomain.GetCurrentThreadId());
        }
    }
}

不要忘記事后取消它。 你需要另一個DllImport:

[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);

private void DeactivateMouseHook_Click(object sender, System.EventArgs e)
{
    bool ret = UnhookWindowsHookEx(hHook);
}    

您可以使用HookProc委托(MouseHookProcedure)捕獲鼠標活動。 這涉及一些編組以捕獲數據。

[StructLayout(LayoutKind.Sequential)]
public class POINT 
{
    public int x;
    public int y;
}

[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct 
{
    public POINT pt;
    public int hwnd;
    public int wHitTestCode;
    public int dwExtraInfo;
}

public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{          
    MouseHookStruct MyMouseHookStruct = (MouseHookStruct)
        Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

    // You can get the coördinates using the MyMouseHookStruct.
    // ...       
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
}

不要忘記之后調用鈎子鏈中的下一個項目(CallNextHookEx)!

[DllImport("user32.dll",CharSet=CharSet.Auto,      
 CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, 
IntPtr wParam, IntPtr lParam);

PS:你可以為鍵盤做同樣的事情。

Windows掛鈎機制是您需要使用的。 看一下這篇文章: 用C#處理全局鼠標和鍵盤鈎子

雖然Christophe Geers解決方案可幫助您捕獲鼠標事件,但它無法提供完整的問題解決方案。 愛德華想知道如何獲得點擊事件。

要獲得點擊事件,請使用Christophe Geers提供的解決方案。 並添加/編輯以下內容:

enum MouseMessages
{
    WM_LBUTTONDOWN = 0x0201,
    WM_LBUTTONUP = 0x0202,
    WM_MOUSEMOVE = 0x0200,
    WM_MOUSEWHEEL = 0x020A,
    WM_RBUTTONDOWN = 0x0204,
    WM_RBUTTONUP = 0x0205
}

public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    //Marshall the data from the callback.
    MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

    if (nCode >= 0 &&
        MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
    {
        // Do something here
    }
    return CallNextHookEx(hookHandle, nCode, wParam, lParam);
}

你只需要一個鼠標鈎。 它可以檢測您的鼠標移動或點擊。 您可以在此處下載演示: C#mouse_hook_Demo
當您按下鼠標並將其釋放時,您將在richtextbox上看到該事件。

private void mh_MouseDownEvent(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                richTextBox1.AppendText("Left Button Press\n");
            }
            if (e.Button == MouseButtons.Right)
            {
                richTextBox1.AppendText("Right Button Press\n");
            }
        }

        private void mh_MouseUpEvent(object sender, MouseEventArgs e)
        {

            if (e.Button == MouseButtons.Left)
            {
                richTextBox1.AppendText("Left Button Release\n");
            }
            if (e.Button == MouseButtons.Right)
            {
                richTextBox1.AppendText("Right Button Release\n");
            }

        }
        private void mh_MouseClickEvent(object sender, MouseEventArgs e)
        {
            //MessageBox.Show(e.X + "-" + e.Y);
            if (e.Button == MouseButtons.Left)
            {
                string sText = "(" + e.X.ToString() + "," + e.Y.ToString() + ")";
                label1.Text = sText;
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM