我有一个小窗口形式,而不是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.");
}
}
}
答案 0 :(得分:0)
在调查之后我不得不承认我错了,编辑控件的通常行为似乎是在用户开始输入时隐藏鼠标光标。
似乎有一种方法可以像你尝试一样使用SystemParametersInfo
,但在阅读之后不知怎的,我不确定这是否会改变系统范围的设置。
当然,您可以在MouseEnter
和MouseLeave
设置并重置它,一旦您有一个正常工作的版本,请在此处发布!
但是我找到了一个解决方法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;