在C#的WPF中,我能否隐藏所有窗口中的光标?

3
大家好。
当我使用C#,WPF开发应用程序时,我想在某些特殊区域隐藏我的光标。无论顶部有哪个应用程序/窗口,光标始终隐藏。
在WPF窗口中,通常我们使用元素来设置鼠标指针的样式。但是,如果您想要完全隐藏光标,可以使用以下代码:
Cursor = Cursors.None;
此代码将使光标完全消失,即使在某个特定区域内也是如此。
this.Cursor = System.Windows.Input.Cursors.None;

但这一个无法解决我的问题。
我希望的情况是:
当我打开窗口时,光标会消失在窗口中。然后我在窗口上方打开记事本,光标也会在记事本中消失。
是否有这样的解决方法呢?谢谢。

光标由鼠标所在的窗口控制,即屏幕上该位置最上面的窗口。因此,如果您希望屏幕的特定区域没有光标,您需要将您的窗口设置为Topmost。这是否符合您的要求? - Joe White
@JoeWhite 谢谢你的回答。这不是我想要的。如果窗口是最顶层的,所有其他窗口都将不可见。但我希望所有其他窗口出现时没有真正的光标。 - cindywmiao
@cindywmiao,你什么时候想重新启用光标?在你的应用程序内还是任何地方都可以重新启用? - Elangovan
@cindywmiao 你可以使用这个来隐藏系统指针。https://dev59.com/tGPVa4cB1Zd3GeqP8LNP - Elangovan
5个回答

3
您也可以使用Win32 DLL。
internal static class WinCursors
{
    [DllImport("user32.dll")]
    private static extern int ShowCursor(bool bShow);


    internal static void ShowCursor()
    {
        while (ShowCursor(true) < 0)
        {

        }
    }

    internal static void HideCursor()
    {
        while (ShowCursor(false) >= 0) //使用这个方法可以关闭光标
        {

        }
    }
}

0

在你的mouseEnter事件中,简单地使用cursor hide即可。

    private void splitContainer1_Panel2_MouseEnter(object sender, EventArgs e)
    {
       Cursor.Hide();
    }

非常感谢。但是它似乎对我的情况不起作用。我想打开我的窗口,光标会在我的窗口中消失。然后在我的窗口上方打开记事本,光标也会在记事本中消失。 - cindywmiao
我猜这是因为它即使你把记事本放在它上面,也会检测到mouseEnter事件。这可以通过创建一个custom panel: panel或者也称为double panel来解决。 - jhyap
我找不到Cursor类型的Cursor.Hide - lindexi
System.Windows.Input.Cursor没有“Hide”、“Show”或类似的方法。如果您确实想要在窗口上隐藏/显示光标,请注意两个规则:1)如果将窗口背景设置为透明,则光标事件将变得无法触摸;2)根据规则1,您可以在.cs文件中设置Mouse.Cursor=Cursors.None或在XAML中将属性Cursor="None"附加到控件上。希望这些能够帮助您。 - Jog Dan

0
如果每个窗体上的区域都相同,您可以创建一个自定义的BaseForm(或类似)从Form派生,并在其上放置一个标签,并使用其MouseEnter和MouseLeave事件来隐藏光标。
然后,所有窗体都可以从BaseForm而不是Form派生,以便它们都具有此区域。

非常感谢,我已经更清楚地编辑了我的问题,MouseEnter和MouseLeave似乎对我的情况不起作用。 - cindywmiao
好的,我怀疑这里的简短答案是否定的。显然,记事本是一个完全独立的应用程序,无法从您的应用程序访问其属性(即使有,它也将以C++或C编写,因此不会有Form对象等)。 - dyson

0

你尝试过使用窗口类的事件 Activated、FocusableChanged 或其他相关事件吗?


0

处于顶部的窗口控制鼠标光标。所以唯一的方法是将您的窗口置于顶部,可能通过使其成为 最顶层 来实现。

如果您仍然希望能够看到它下面的窗口,则可以将您的窗口设置为半透明。将 AllowsTransparency 属性设置为 true,然后将您的窗口背景颜色设置为半透明颜色。(您无法使其100%透明,因为WPF将完全透明视为“这里没有任何东西,因此将鼠标事件发送给我后面的下一个窗口”;但您可以做类似于#01000000那样接近透明,以至于没有人会注意到它。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接