visuales trucos texto puedo mensajes enviar efectos desde con como c++ winapi controls combobox message

c++ - trucos - ¿Cómo enviar un mensaje CBN_SELCHANGE cuando se usa CB_SETCURSEL?



mensajes iphone (3)

Se supone que no debes usar CBN_SELCHANGE a menos que el cambio en la selección haya sido realizado por el usuario.

No indicas qué idioma estás usando; sería más fácil proporcionarle una solución alternativa si lo hiciera.

En Delphi, donde un OnChange () se asociaría con el cuadro combinado, simplemente llama al método de evento directamente:

// Send the CB_SETCURSEL message to the combobox PostMessage(ComboBox1.Handle, CB_SETCURSEL, Whatever, WhateverElse); // Directly call the OnChange() handler, which is the equivalent to CBN_SELCHANGE ComboBox1Change(nil);

Cuando se usa el mensaje CB_SETCURSEL , el mensaje CBN_SELCHANGE no se envía.

¿Cómo notificar a un control que se cambió la selección?

PD

Encontré en el sitio Sexchange , un truco muy feo :

SendMessage( hwnd, 0x014F/*CB_SHOWDROPDOWN*/, 1, 0 ); SendMessage( hwnd, 0x014E/*CB_SETCURSEL*/, ItemIndex, 0 ); SendMessage( hwnd, 0x0201/*WM_LBUTTONDOWN*/, 0, -1 ); SendMessage( hwnd, 0x0202/*WM_LBUTTONUP*/, 0, -1 );

Lo haré por ahora ... En realidad no.

PS2

Para resolver mi problema, seguiré la sugerencia de Ken en los comentarios.


Esto podría ayudar a la próxima persona:

[DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam); [DllImport("user32.dll", EntryPoint = "GetWindowLong")] private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")] private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex); public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex) { if (IntPtr.Size == 8) return GetWindowLongPtr64(hWnd, nIndex); else return GetWindowLongPtr32(hWnd, nIndex); } static int MakeWParam(int loWord, int hiWord) { return (loWord & 0xFFFF) + ((hiWord & 0xFFFF) << 16); } public const int CB_SETCURSEL = 0x014E; public const int CBN_SELCHANGE = 0x0001; public enum GWL { GWL_WNDPROC = (-4), GWL_HINSTANCE = (-6), GWL_HWNDPARENT = (-8), GWL_STYLE = (-16), GWL_EXSTYLE = (-20), GWL_USERDATA = (-21), GWL_ID = (-12) } public static IntPtr Hwnd_select_control_parent = IntPtr.Zero; public static IntPtr Hwnd_select_control = IntPtr.Zero; static void changeit() { // Google WinSpy for tips on how to figure out how to get window handles from known ctrl_id Hwnd_select_control = 14298; // or whatever the handle of the combo box is // Get the parent of the selectbox control Hwnd_select_control_parent = GetWindowLongPtr(service_window_control, (int)GWL.GWL_HWNDPARENT); // Get the control id of the selectbox if you don''t already have it IntPtr nID = GetWindowLongPtr(Hwnd_select_control, (int)GWL.GWL_ID); int ctrl_id = nID.ToInt32(); // Change the combo box to the value "My Value" SendMessage(Hwnd_select_control, CB_SETCURSEL, "My Value", null); // low ID is the ctrl_id of the combo box, high id is CBN_SELCHANGE int send_cbn_selchange = MakeWParam(ctrl_id, CBN_SELCHANGE); // Send the WM_COMMAND to the parent, not the control itself SendMessage(Hwnd_serviceselect_control_parent, 0x111 /* WM_COMMAND */, send_cbn_selchange, Hwnd_serviceselect_control.ToInt32()); }


Acabo de descubrir que llamar a SendMessages al Combobox funciona dos veces ... Sé que no es perfecto, pero funcionó para mí. (Escrito en VB6)

For looper = 1 To 2 bVal = SendMessage(inHandle, COMBO.CB_SHOWDROPDOWN, True, 0) count = SendMessage(inHandle, COMBO.CB_SETCURSEL, 1, 0) count = SendMessage(inHandle, WIND.WM_LBUTTONDOWN, 0, -1) Next