由于要求发生变化,此问题与我无关。 我在这里给出了答案,这是我不再需要答案的时候得到的最佳答案。感谢。
我想改变整个系统的鼠标光标(不只是一个表格) 并向左键单击设置不同的光标,向右键单击设置不同的光标。
已经看到各种各样的例子,但没有那样。
我在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);
但现在的问题是它只能在我的表单上运行,除了它没有显示第二个游标。无论光标在哪里,我都需要一直显示它们。感谢您的帮助。
答案 0 :(得分:1)
对于答案,我已经问过用C#做这件事的唯一方法是使用PInvoke,正如其他用户所说的那样。
正如您在我的问题中看到的那样,我会收听Windows消息,拦截左键单击消息和左键单击消息,并为它们设置其他游标。还有空闲光标。
我留下的最后一个问题是游标的更改在Windows上没有全局工作,只有空闲光标发生了变化。虽然在我的申请表格上确实改变了另一个光标。在我的CopyIcon
添加之前 - 它在所有窗口上工作但只有一次而不是更多。
这个问题与我无关,因为我改变了我想要完成的事情。希望这些代码和解释能够在将来帮助某些人。感谢。