ListViewで全ての項目を選択した状態にしたいとき。
マネージで普通に書くとループなりイテレータなりでこんな感じ。
foreach(var item in listview.Items){
((ListViewItem)item).Selected = true;
}
数が増えると遅い。
SendMessage一発ではやい。
private const UInt32 LVM_FIRST = 0x1000;
private const UInt32 LVM_SETITEMSTATE = (LVM_FIRST + 43);
private const UInt32 LVIF_STATE = 0x0008;
private const UInt32 LVIS_SELECTED = 0x0002;
struct LVITEM
{
public UInt32 mask;
public Int32 iItem;
public Int32 iSubItem;
public UInt32 state;
public UInt32 stateMask;
public string pszText;
public Int32 cchTextMax;
public Int32 iImage;
public IntPtr lParam;
/* 以下略 */
}
public void SelectAllItems()
{
LVITEM lvitem = new LVITEM();
lvitem.mask = LVIF_STATE;
lvitem.state = LVIS_SELECTED;
lvitem.stateMask = LVIS_SELECTED;
SendMessage(listview.Handle, LVM_SETITEMSTATE, (IntPtr)(-1), ref lvitem);
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 uMsg, IntPtr wParam, ref LVITEM lParam);