我正在尝试实现一个像“Gyazo”这样的软件,这是一个截图工具。程序开始(屏幕上什么都没有出现,除了光标变化),用户点击A点,然后拖动到B点(画一个透明的矩形),松开鼠标,然后保存截图,程序关闭。
我绘制透明矩形的方式是,我重新调整大小并重新定位具有 30% 透明度的表单。所以光标永远不会在表格上!为了更改光标,因为它在表单之外,我尝试使用:
[DllImport("user32.dll")]
static extern bool SetSystemCursor(IntPtr hcur, uint id);
[DllImport("user32.dll")]
static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);
private int CROSS = 32515;
private const uint NORMAL = 32512;
//and then calling
SetSystemCursor(LoadCursor(IntPtr.Zero, CROSS), NORMAL);
我在使用这段代码时遇到的问题是它确实有问题。当窗体关闭时,光标不会变回正常。我不知道如何正确还原光标。此外,当表单从任务管理器关闭时恢复光标是不可能的,对吗?
在这种情况下,您建议使用其他什么方法将光标更改为交叉?
编辑: 只是为了澄清一下,因为我试着问了一个类似的问题,之前被标记为重复 this question我删除了它,我想做的是相似的,但有很多不同,因为在那个问题中提供的答案中,答案中提供的解决方案是制作一个全屏无边框表格,设置屏幕截图桌面作为该表格的背景,然后从中裁剪一个矩形。首先,该解决方案会“卡住”屏幕,因为在进行裁剪时您只能看到桌面照片,其次,以这种方式处理多显示器设置几乎是不可能的。此外,它还会做额外和不必要的工作。
最佳答案
尝试把它放在你的 Program.cs 文件中
static class Program
{
[DllImport("user32.dll")]
static extern bool SetSystemCursor(IntPtr hcur, uint id);
[DllImport("user32.dll")]
static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32
uiParam, String pvParam, UInt32 fWinIni);
private static uint CROSS = 32515;
private static uint NORMAL = 32512;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SetSystemCursor(LoadCursor(IntPtr.Zero, (int)NORMAL), CROSS);
//Also other pointers to CROSS if you want
Application.Run(new Form1());
SystemParametersInfo(0x0057, 0, null, 0);
}
}
这将在应用程序结束或崩溃时恢复正常..
所以就像从 Normal 更改为 Cross,你可以将任何你想要的光标更改为 Arrow
当您停止应用程序 (Ctrl+F5) 时它不会工作,因为那样会跳过所有行。但将在发布应用程序后完全工作。
关于c# - 表单打开时将光标更改为交叉(代码段工具),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738090/