在windows文本框中键入时保持鼠标光标可见

本文关键字:鼠标 光标 文本 windows | 更新日期: 2023-09-27 18:05:22

我有一个小的窗口窗体,而不是WPF,这是一个快速参考工具,其中用户键入一个值并按下一个按钮,查询打开带有数据的详细信息视图。

当用户在文本框中键入时,我希望鼠标光标始终保持可见,以便在任何时候都更容易单击查询按钮,而不必移动鼠标以使鼠标光标重新出现。其他软件也会这样做,比如Visual Studio的文本编辑器窗口。鼠标光标始终可见。

我想使用本地Windows"SystemParametersInfo"函数与SPI_SETMOUSEVANISH标志设置为不隐藏鼠标时,用户类型,然后返回到默认设置时,我的窗体关闭。是否有人成功地使用了Windows SystemParametersInfo函数来显示鼠标光标?我似乎不能使它工作。如果有人能告诉我如何捕捉隐藏鼠标光标的事件,或正确应用SystemParameters信息,我将非常感激。

这是我正在使用的代码。

    [DllImport("user32.dll", EntryPoint = "SystemParametersInfo",   SetLastError = true)]
    public static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, ref bool pvParam, SPIF fWinIni);
    [Flags]
    public enum SPIF
    {
    None = 0x00,
    /// <summary>Writes the new system-wide parameter setting to the user profile.</summary>
    SPIF_UPDATEINIFILE = 0x01,
    /// <summary>Broadcasts the WM_SETTINGCHANGE message after updating the user profile.</summary>
    SPIF_SENDCHANGE = 0x02,
    /// <summary>Same as SPIF_SENDCHANGE.</summary>
    SPIF_SENDWININICHANGE = 0x02
    }
    [System.ComponentModel.Description("SPI_(System-wide parameter - Used in SystemParametersInfo function )")]
    public enum SPI : uint
    {
    /// <summary>
    /// Retrieves the two mouse threshold values and the mouse speed.
    /// </summary>
    SPI_GETMOUSE = 0x0003,
    /// <summary>
    /// Sets the two mouse threshold values and the mouse speed.
    /// </summary>
    SPI_SETMOUSE = 0x0004,
    /// <summary>
    /// Retrieves the state of the Mouse Vanish feature. The pvParam 
    parameter must point to a BOOL
    /// variable that receives 'true' if enabled or 'false' otherwise.
    /// Windows 2000/NT, Windows 98/95:  This value is not supported.
    /// </summary>
    SPI_GETMOUSEVANISH = 0x1020,
    /// <summary>
    /// Turns the Vanish feature on or off. This feature hides the mouse pointer when the user types; the pointer reappears 
    /// when the user moves the mouse. The pvParam parameter specifies true for on and false for off. The default is off (false).
    /// In Windows 2000/NT, Windows 98/95, this value is not supported.
    /// </summary>
    SPI_SETMOUSEVANISH = 0x1021
    }
       private void disableMouseVanish()
    {
        // Query current system parameter for
        // whether or not the mouse is hidden
        // while typing in a textbox.
        //
        successfullyQueried = NativeMethods.SystemParametersInfo(
            NativeMethods.SPI.SPI_GETMOUSEVANISH, 0, ref mouseHiddenWhileTyping, NativeMethods.SPIF.None);
        //
        if (successfullyQueried && mouseHiddenWhileTyping)
        {
            // Set flag to false and apply.
            mouseHiddenWhileTyping = false;
            //
            // Set system parameter to always show mouse
            // cursor while typing in textboxes.
            successfullyQueried = NativeMethods.SystemParametersInfo(
                NativeMethods.SPI.SPI_SETMOUSEVANISH, 0, ref mouseHiddenWhileTyping,
                NativeMethods.SPIF.SPIF_SENDCHANGE | NativeMethods.SPIF.SPIF_UPDATEINIFILE);
            //
            // Verify was successfully set.
            if (successfullyQueried && !mouseHiddenWhileTyping)
            {
                // I get here every time, but the mouse cursor
                // still gets hidden while I type.
                // Set flag to ignore showing mouse after
                // every key press event.
                //skipShowMouse = true;                    
                MessageBox.Show("Non-zero return (true) indicates sucess.");
            }
            else if (!successfullyQueried)
            {
                ///
                /// We could read the value, but
                /// not set it.
                MessageBox.Show("Error: Failed to set the specified system parameter.");
            }
        }
    }

在windows文本框中键入时保持鼠标光标可见

经过调查,我不得不承认我错了,编辑控件的通常行为似乎隐藏鼠标光标当用户开始输入

似乎有一种方法可以像你一样使用SystemParametersInfo,但不知怎的,在阅读了它之后,我不确定这是否会改变系统范围的设置。

当然你会在MouseEnterMouseLeave上设置和重置它,一旦你有一个工作版本请在这里发布!

但是我在这里找到了一个解决方法,我猜可以称之为hack,但是经过一些友好的调整,它似乎可以工作。

以下是我所做的:创建一个虚拟ListViewCapture,并在适当的时候释放鼠标!
ListView dummy;
public Form1()
{
    InitializeComponent();
    dummyLV = new ListView();
    dummyLV.Visible = false;
    dummyLV.Enabled = false;
    this.Controls.Add(dummyLV );
    //..

我在这些文本框事件中将Capture设置为true:

  • MouseEnter
  • KeyDown

dummyLV.Capture = true;

我在这里把它重置为false:

  • MouseLeave
  • MouseMove
  • KeyUp(可能没有必要)

dummyLV.Capture = false;

显然是一个hack,但我不能找到错误在它到目前为止…鼠标保持可见,可以用于选择文本以任何方式…

注意:代替ListView许多其他控件,甚至一个简单的Label也可以工作,正如Matt在他的最后评论中指出的。

实际情况是,在按下键后,当前光标被设置为null。

然而,

没有被处理,而是被存储在其他地方。

我的修复方法如下:

using System.Windows.Forms;
Cursor storedCursor = null;
private void TextBox_KeyPress(object sender, KeyPressEventArgs e)        
{
    storedCursor = Cursor.Current;
}
private void TextBox_TextChanged(object sender, EventArgs e)
{
    if(Cursor.Current == null)
    {
        Cursor.Current = storedCursor;
    }
}

或者,您可以将当前光标设置为任何值。

Cursor.Current = Cursors.Default;
Cursor.Current = Cursors.IBeam;