It seems that .Net library doesn’t provide any way to scroll contents of ListBox through code. Selecting an item by setting SelectedIndex
automatically scrolls the list to bring the item into view but this may not produce the desired effect. In my case, I wanted to programmatically select an item and make it the first visible item in the list. This effect cannot be achieved through changing SelectedIndex
.
The way around this problem is to invoke Windows API SendMessage
function.
To call a function from an un-managed DLL, we have to declare it along with DLLImport attribute.
[DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
As the declaration shows, we have supply four arguments.
S/N | Parameter | Description |
1 | IntPtr hWnd | This is the handle to ListBox Control. We can get the handle through Handle property of ListBox control e.g. myListBox.Handle |
2 | uint Msg | This should be set as WM_VSCROLL. It says that we want to send message for scrolling vertically. Find list of messages that could be passed to a control here. |
3 | uint wParam | This 32 bit parameter has two parts.
|
4 | uint lParam | This parameter is for additional message specific information. For our purposes, we will just pass 0. |
Following is the SendMessage function call to scroll the list. First, we define the constants WM_VSCROLL and SB_THUMBPOSITION. Then we develop the thrid paramter by combining LOWORD and HIWORD. Finally the function is called.
const uint WM_VSCROLL = 0x0115; const uint SB_THUMBPOSITION = 4; uint param = ((uint)(lstFont.SelectedIndex) << 16) | (SB_THUMBPOSITION & 0xffff); SendMessage(myListBox.Handle, WM_VSCROLL, param, 0);