如何在系统范围内左右更改鼠标光标?
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);
}
}
我知道有一个名为 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);
但是现在的问题是它只适用于我的表单,在外面它不显示第二个光标。我需要一直显示它们,无论光标在哪里。感谢您的帮助。
对于我问过的答案,从 C# 执行此操作的唯一方法是像其他用户所说的那样使用 PInvoke。
如您在我的问题中所见,我收听 windows 消息,拦截左键单击向下消息和左键单击向上消息,并为它们设置其他光标。以及空闲光标。
我留下的最后一个问题是,在 windows 上,游标的更改在全局范围内不起作用,只有空闲游标发生了更改。尽管在我的申请表上它确实变成了另一个光标。在我添加 CopyIcon
之前-它对所有 windows 都起作用,但只起作用一次,之后不会再起作用。
这个问题与我无关了,因为我改变了我想完成的事情。希望这些代码和解释中的一些对将来的人有所帮助。谢谢
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);
}
}
我知道有一个名为 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);
但是现在的问题是它只适用于我的表单,在外面它不显示第二个光标。我需要一直显示它们,无论光标在哪里。感谢您的帮助。
对于我问过的答案,从 C# 执行此操作的唯一方法是像其他用户所说的那样使用 PInvoke。
如您在我的问题中所见,我收听 windows 消息,拦截左键单击向下消息和左键单击向上消息,并为它们设置其他光标。以及空闲光标。
我留下的最后一个问题是,在 windows 上,游标的更改在全局范围内不起作用,只有空闲游标发生了更改。尽管在我的申请表上它确实变成了另一个光标。在我添加 CopyIcon
之前-它对所有 windows 都起作用,但只起作用一次,之后不会再起作用。
这个问题与我无关了,因为我改变了我想完成的事情。希望这些代码和解释中的一些对将来的人有所帮助。谢谢