为什么ComboBox在设置DroppedDown时会隐藏光标?

让我们创建WinForms应用程序(我在Windows Vista上运行Visual Studio 2008,但似乎所描述的情况几乎发生在从Win98到Vista的本地或托管代码中)。

写这样的代码:

using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public class Form1 : Form { private readonly Button button1 = new Button(); private readonly ComboBox comboBox1 = new ComboBox(); private readonly TextBox textBox1 = new TextBox(); public Form1() { SuspendLayout(); textBox1.Location = new Point(21, 51); button1.Location = new Point(146, 49); button1.Text = "button1"; button1.Click += button1_Click; comboBox1.Items.AddRange(new[] {"1", "2", "3", "4", "5", "6"}); comboBox1.Location = new Point(21, 93); AcceptButton = button1; Controls.AddRange(new Control[] {textBox1, comboBox1, button1}); Text = "Form1"; ResumeLayout(false); PerformLayout(); } private void button1_Click(object sender, EventArgs e) { comboBox1.DroppedDown = true; } } } 

然后,运行应用程序。 将鼠标光标放在窗体上,不要再触摸鼠标。 开始在TextBox中键入内容 – 光标将因此而隐藏。 当您按Enter键 – 事件抛出和ComboBox将被删除。 但是现在即使你移动它也不会出现光标! 并且仅在您单击某处时出现。

在那里,我发现了对这个问题的讨论。 但是没有好的解决方案……

有什么想法吗? 🙂

我能够解决这个问题:

 comboBox1.DroppedDown = true; Cursor.Current = Cursors.Default; 

如果你像我一样受到这个问题的影响,我建议你投票给相关的微软错误报告 。 也许有一天他们会解决它!

我在Delphi应用程序上遇到了这个问题。 正如我在这里建议的那样,我在任何DropDown事件之后添加了SendMessage(ComboBox1.Handle, WM_SETCURSOR, 0, 0)并且它工作正常。

首先,这是一个非常模糊的环境,我无法想象它是一个有用的界面动作。

这似乎是一个错误导致程序化下拉列表在构成下拉控件的一部分的文本框中开始编辑,因此有效地隐藏了光标。 打破它…

我怀疑每个hide都存储光标的状态并在退出时恢复它。

文本框已存储实际的游标状态并将其隐藏。

下拉列表导致隐藏状态被存储并且光标设置为隐藏。 当你移动光标时,它可能会恢复它,但它保存到隐藏状态,因此光标保持隐藏状态。

点击表格似乎强制重置那种情况,不知道为什么会这样,但这是我的2个百分之一的价值。

事实上,我能够以这种方式解决这个问题:

 #region Dirty methods :) #pragma warning disable 169 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); private const int MOUSEEVENTF_ABSOLUTE = 0x8000; private const int MOUSEEVENTF_MOVE = 0x1; private const int MOUSEEVENTF_LEFTDOWN = 0x02; private const int MOUSEEVENTF_LEFTUP = 0x04; private const int MOUSEEVENTF_RIGHTDOWN = 0x08; private const int MOUSEEVENTF_RIGHTUP = 0x10; #pragma warning restore 169 #endregion private void button1_Click(object sender, EventArgs e) { Point oldCursorPos = Cursor.Position; // save pos Point a = comboBox1.Parent.PointToScreen(comboBox1.Location); aX += comboBox1.Width - 3; aY += comboBox1.Height - 3; Cursor.Position = a; // simuate click on drop down button mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); Cursor.Position = oldCursorPos; // restore pos } 

但它不是我想要的解决方案:(这是一个拐杖而不是解决方案。

这是一组奇怪的情况,其中combobox是DropDownList类型,并且您可以在代码中调用combobox中的DroppedDown方法,无论它是否具有焦点。

光标将在表单后面消失。 如果单击表单,光标将返回,但combobox将关闭,因此效果不佳。

我可以确认此代码在不关闭combobox列表的情况下修复了该问题。

 cbo_VisitorTypes.DroppedDown = true; Cursor.Current = Cursors.Default;