你把SendMessage定义成
SendMessage(int hwd,int msg,IntPtr lpara,StringBuilder sb)然后
string strptr="123123";
SendMessage(iHnd, LB_SELECTSTRING, new IntPtr(0), new StringBuilder(strptr));
SendMessage(int hwd,int msg,IntPtr lpara,StringBuilder sb)然后
string strptr="123123";
SendMessage(iHnd, LB_SELECTSTRING, new IntPtr(0), new StringBuilder(strptr));
sendMessage 是系统api中取出来的,
难道可以随便改?
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage( IntPtr hWnd,
int Msg,
IntPtr wParam,
IntPtr lParam
);
string keystring="123123";
strptr=keystring.ToCharArray();
string keystring="123123";
strptr=keystring.ToCharArray();
这么做了之后是否strptr是指向keystring.ToCharArray()返回的地址,还是将自己的内存空间添上了123123 ???
.net中非托管字符串的封送是通过StringBuilder来实现的,建议你查查msdn“封送字符串”
char[] strptr=new char[100];
string keystring="123456";
keystring.CopyTo(0, strptr, 0, keystring.Length);不过看你的情况不需要这样做,可以将sendmessage定义多一个OVERLOAD:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage( IntPtr hWnd, int Msg,int wParam,
[System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]string lParam);
就可以解决,连UNSAFE都不必用。
int index=SendMessage(this.listBox1.Handle, LB_SELECTSTRING, 0, keystring);
MessageBox.Show(index.ToString());另外还可以用listbox的FindString方法代替调用API,但不知道你的具体情况,只能供你参考