你把SendMessage定义成
SendMessage(int hwd,int msg,IntPtr lpara,StringBuilder sb)然后
string strptr="123123";
SendMessage(iHnd, LB_SELECTSTRING, new IntPtr(0), new StringBuilder(strptr));

解决方案 »

  1.   

    ??
    sendMessage 是系统api中取出来的,
    难道可以随便改?
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int SendMessage( IntPtr hWnd,
    int Msg,
    IntPtr wParam,
    IntPtr lParam
    );
      

  2.   

    char[] strptr=new char[100];
    string keystring="123123";
    strptr=keystring.ToCharArray();
      

  3.   

    char[] strptr=new char[100];
    string keystring="123123";
    strptr=keystring.ToCharArray();
    这么做了之后是否strptr是指向keystring.ToCharArray()返回的地址,还是将自己的内存空间添上了123123 ???
      

  4.   

    你这样啥也不是,已经走错路了
    .net中非托管字符串的封送是通过StringBuilder来实现的,建议你查查msdn“封送字符串”
      

  5.   

    单纯是string=>char[],可以这样:
    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,但不知道你的具体情况,只能供你参考