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

时间:2014-05-27 04:16:34

标签: c# winforms

我有一个小窗口形式,而不是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.");
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

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

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

当然,您可以在MouseEnterMouseLeave设置并重置它,一旦您有一个正常工作的版本,请在此处发布!

但是我找到了一个解决方法here,我可以称之为黑客,但是通过一些友好的调整它似乎有效。

以下是我所做的:创建一个虚拟ListView Capture并在适当时释放鼠标!

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;

我在这里重置为假:

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

dummyLV.Capture = false;

显然是一个黑客,但到目前为止我无法找到它的错误。鼠标保持可见,可用于以任何方式选择文本..

注意:而不是 ListView ,许多其他控件,甚至是简单的标签也会起作用,正如Matt在上一篇评论中所指出的那样..

答案 1 :(得分:0)

发生的事情是,在按键后立即将“当前光标”设置为空。

但是,它不会被丢弃,而是存储在其他位置。

我的解决方法如下:

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;