在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.");
}
}
}
经过调查,我不得不承认我错了,编辑控件的通常行为似乎隐藏鼠标光标当用户开始输入。
似乎有一种方法可以像你一样使用SystemParametersInfo
,但不知怎的,在阅读了它之后,我不确定这是否会改变系统范围的设置。
当然你会在MouseEnter
和MouseLeave
上设置和重置它,一旦你有一个工作版本请在这里发布!
但是我在这里找到了一个解决方法,我猜可以称之为hack,但是经过一些友好的调整,它似乎可以工作。
以下是我所做的:创建一个虚拟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;
我在这里把它重置为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;