如何在系统范围内左右更改鼠标光标?

How to change mouse cursor on left and right click system wide?

Due to a change in requirements, this question is no longer relevant to me. I gave an answer here which is the best answer I got by the time I no longer needed it to be answered. Thanks.

我想改变整个系统的鼠标光标(不只是一个表格) 并将不同的光标设置为左键单击,将不同的光标设置为右键单击。

看到过各种各样的例子,但没有看到那样的例子。

我在 VS2015 上使用 C#,非常感谢您的帮助。

更新:

我现在有一个工作代码。几乎完全。我正在收听 windows 消息并使用 PInvoke 的 SetSystemCursor 响应鼠标点击。 (第一个问题可能已解决,但我还有另一个问题) 我可以用我加载的另一个光标替换默认光标。我也可以左键单击并更改光标,它也会恢复到我加载的第一个光标。 问题是,在第二次左键单击并继续单击后,光标不会改变,并且会停留在我加载的第一个光标上。有趣的是,设置光标的每个部分都会弹出消息框,但是光标不会改变,所以我知道这是关于光标的。我也尝试捕获错误,但什么也没有出现。在检查了那部分代码之后,ret_val returns 0(失败)。知道如何解决这个问题吗?这是我的代码:

       public partial class Form1 : Form
{

    [DllImport("user32.dll")]
    static extern IntPtr LoadCursorFromFile(string lpFileName);

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool SetSystemCursor(IntPtr hcur, uint id);

    private const uint OCR_NORMAL = 32512;

    private const int WM_LBUTTONDOWN = 0x0201;
    private const int WM_LBUTTONUP = 0x0202;

    string path1;
    string path2;
    IntPtr cursor;
    IntPtr cursorLMB;

    bool ret_val;

    public Form1()
    {
        InitializeComponent();

        path1 = @"C:\cursor.cur";
        path2 = @"C:\cursorLMB.cur";

        cursor = LoadCursorFromFile(path1);
        cursorLMB = LoadCursorFromFile(path2);
        //IntPtr cursorRMB = LoadCursorFromFile(path); not implemented yet

       }
 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_LBUTTONDOWN:

                try
                {
                    ret_val = SetSystemCursor(cursorLMB, OCR_NORMAL);
                }
                catch (Win32Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                //  MessageBox.Show("WM_LBUTTONDOWN"); *This works all the time!
                break;

            case WM_LBUTTONUP:
                try
                {
                    ret_val = SetSystemCursor(cursor, OCR_NORMAL);
                   //   MessageBox.Show("WM_LBUTTONUP"); *This works all the time!
                }
                catch (Win32Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

                break;
             }
        base.WndProc(ref m);
    }
}

我知道有一个名为 CopyCursorinfo here 的函数,并且还阅读并理解了我正在寻找的解决方案可能涉及该函数,但我不知道发生了什么以及如何发生解决问题。 更新 2: 我在 PInvoke 上读到 CopyCursor 不能在托管代码中工作,应该使用 CopyIcon 代替,我试着玩弄它,我已经设法让它与这个一起工作我写的代码:

 switch (m.Msg)
        {
            case WM_LBUTTONDOWN:

                try
                {
                    if (cursorLMB != IntPtr.Zero)
                        SetSystemCursor(CopyIcon(cursorLMB), OCR_NORMAL);
                    else
                        SetSystemCursor(IntPtr.Zero, OCR_NORMAL);
                }
                catch (Win32Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                break;

            case WM_LBUTTONUP:
                try
                {
                    if (cursor != IntPtr.Zero)
                        SetSystemCursor(CopyIcon(cursor), OCR_NORMAL);
                    else
                        SetSystemCursor(IntPtr.Zero, OCR_NORMAL);
                }
                catch (Win32Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

                break;
             }
        base.WndProc(ref m);

但是现在的问题是它只适用于我的表单,在外面它不显示第二个光标。我需要一直显示它们,无论光标在哪里。感谢您的帮助。

对于我问过的答案,从 C# 执行此操作的唯一方法是像其他用户所说的那样使用 PInvoke。

如您在我的问题中所见,我收听 windows 消息,拦截左键单击向下消息和左键单击向上消息,并为它们设置其他光标。以及空闲光标。

我留下的最后一个问题是,在 windows 上,游标的更改在全局范围内不起作用,只有空闲游标发生了更改。尽管在我的申请表上它确实变成了另一个光标。在我添加 CopyIcon 之前-它对所有 windows 都起作用,但只起作用一次,之后不会再起作用。

这个问题与我无关了,因为我改变了我想完成的事情。希望这些代码和解释中的一些对将来的人有所帮助。谢谢