I think you mean:
quote:
code:
Interop.Call("user32", "SendMessageW", PlusWnd.GetControlHandle(ControlId), CB_GETLBTEXT, Index, Data);
otherwise that code, as you showed it here, doesn't make any sense at all as it is missing a big part at the beginning...
And... (when that part would have been there), your code:
- will not return the proper text for the first item in the list because of
if(!Index). This is not the proper way to handle an optional parameter. If Index is 0, to get the first item of the list, then (!Index) will be -1, aka True and thus the selected item will be returned instead of the first item in the list.
To check if an optional parameter is used or not you need to do:
if (typeof(myvariable) === 'undefined')
- will go bananas when you give a too high index as a parameter because CB_GETLBTEXTLEN and other messages will return CB_ERR in that case and your datablock will have a bad length.
- will go bananas when nothing is selected in the list and you request the selected item because the new Index will be CB_ERR in that case.
If you use
my snippets you wont have those problems and it would also be faster.
Here is that last and shortest snippet again, but with the addition of the optional index so that you can get the current selected item also (=addition of the second line):
code:
function Combo_GetItemText(pPlusWnd, sControlId, nItemIdx) {
var hControl = pPlusWnd.GetControlHandle(sControlId);
if (typeof(nItemIdx) === 'undefined') nItemIdx = Interop.Call("User32", "SendMessageW", hControl, 0x147 /* CB_GETCURSEL */, 0, 0);
var nLength = Interop.Call("User32", "SendMessageW", hControl, 0x149 /* CB_GETLBTEXTLEN */, nItemIdx, 0);
var Buffer = Interop.Allocate(nLength * 2 + 3);
Interop.Call("User32", "SendMessageW", hControl, 0x148 /* CB_GETLBTEXT */, nItemIdx, Buffer.DataPtr);
return Buffer.ReadString(0);
}
