c# - 表单打开时将光标更改为交叉(代码段工具)

标签 c# winforms

我正在尝试实现一个像“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/

相关文章:

C# 最佳实践错误处理和传递错误消息

c# - 为什么 WebApi 在模型状态中将空字符串标记为错误?

c# - IsXValueIndexed 导致图形线条无法绘制

vb.net - 为什么这个关于 Dictionary<TKey, TValue> 的 Linq 查询不作为 DataSource 工作

c# - 如何在不闪烁的情况下为 C# 中的 winforms 自定义控件设置动画?

c# - RegEx 匹配一个模式,只要它前面没有不同的模式

c# - 如何在 .NET/C# 中以编程方式为我的应用程序创建快捷方式 (.lnk) 添加到启动文件夹

c# - 用于照片捕获设备的视频刷的旋转

c# - C# 中 Windows 窗体应用程序的 session

c# - 根据另一个按钮激活或停用按钮