如何在系统左右键单击时更改鼠标光标?

时间:2015-11-30 21:51:23

标签: c# windows winapi mouseevent pinvoke

  

由于要求发生变化,此问题与我无关。       我在这里给出了答案,这是我不再需要答案的时候得到的最佳答案。感谢。

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

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

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

更新

我现在有一个工作代码。几乎完全。我正在收听Windows消息并使用SetSystemCursor PInvoke响应鼠标点击。 (第一个问题可能已修复,但我有另一个问题) 我可以用我加载的另一个游标替换默认光标。我也可以左键单击并更改光标,它也会恢复到我加载的第一个光标。 问题是,在第二次左键单击并打开后,光标不会改变,并且仍然会卡在我加载的第一个光标上。有趣的是,设置光标的每个部分的消息框弹出,但光标不会改变,所以我知道游标的一些东西。我也试图抓住错误但没有出现。在遍历那部分代码之后,ret_val返回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);
    }
}

我知道有一个名为CopyCursor info 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);

现在的问题是它只能在我的表单上运行,除了它没有显示第二个游标。无论光标在哪里,我都需要一直显示它们。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

对于答案,我已经问过用C#做这件事的唯一方法是使用PInvoke,正如其他用户所说的那样。

正如您在我的问题中看到的那样,我会收听Windows消息,拦截左键单击消息和左键单击消息,并为它们设置其他游标。还有空闲光标。

我留下的最后一个问题是游标的更改在Windows上没有全局工作,只有空闲光标发生了变化。虽然在我的申请表格上确实改变了另一个光标。在我的CopyIcon添加之前 - 它在所有窗口上工作但只有一次而不是更多。

这个问题与我无关,因为我改变了我想要完成的事情。希望这些代码和解释能够在将来帮助某些人。感谢。