当我使用 Win32 API 和 P/Invoke 更改 C# WinForms ComboBox.SelectedIndex 时,如何触发 SelectedIndexChanged?
How do I make SelectedIndexChanged trigger when I change C# WinForms ComboBox.SelectedIndex using Win32 API and P/Invoke?
我有一个带有 ComboBox 的 WinForms C# 应用程序,该应用程序正在订阅 SelectedIndexChanged(或 SelectionChangeCommitted)事件。当所选项目以“正常方式”更改时,这非常有效,但是当我使用 P/Invoke 和 Win32 API 从另一个应用程序更改它时,我没有得到事件(但我可以看到所选项目发生变化)。有人知道我该如何解决这个问题吗?
private const int CB_SETCURSEL = 0x14E;
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, ref int lParam);
int lParam = 0;
SendMessage(hWnd, CB_SETCURSEL, 5, ref lParam); // Select item 5 in ComboBox. Doesn't trigger
// SelectedIndexChanged event in the other application!!!
通过使用 SteveWilkinson 在线程 中发布的代码,我能够让它工作。我注意到每次进行新选择时,我的 ComboBox 的句柄都会改变!我认为这是因为它是在 Visual Studio 中创建的,方法是右键单击项目 -> 添加 -> 用户控件...因此对于这个特定的 ComboBox,我还必须存储父句柄,并且每次我需要访问ComboBox 句柄我必须使用 IntPtr GetParent(IntPtr hWnd) 重新发现它。
我有一个带有 ComboBox 的 WinForms C# 应用程序,该应用程序正在订阅 SelectedIndexChanged(或 SelectionChangeCommitted)事件。当所选项目以“正常方式”更改时,这非常有效,但是当我使用 P/Invoke 和 Win32 API 从另一个应用程序更改它时,我没有得到事件(但我可以看到所选项目发生变化)。有人知道我该如何解决这个问题吗?
private const int CB_SETCURSEL = 0x14E;
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, ref int lParam);
int lParam = 0;
SendMessage(hWnd, CB_SETCURSEL, 5, ref lParam); // Select item 5 in ComboBox. Doesn't trigger
// SelectedIndexChanged event in the other application!!!
通过使用 SteveWilkinson 在线程 中发布的代码,我能够让它工作。我注意到每次进行新选择时,我的 ComboBox 的句柄都会改变!我认为这是因为它是在 Visual Studio 中创建的,方法是右键单击项目 -> 添加 -> 用户控件...因此对于这个特定的 ComboBox,我还必须存储父句柄,并且每次我需要访问ComboBox 句柄我必须使用 IntPtr GetParent(IntPtr hWnd) 重新发现它。