Calling SendMessage (P/Invoke) keeps crashing

前端 未结 3 1144
余生分开走
余生分开走 2021-01-06 07:35

I am having to write an application that communicates with a third-party program (AOL, I\'m sorry. :()

Doing a lot of research I found some ways to do this with P/In

3条回答
  •  生来不讨喜
    2021-01-06 08:18

    You are using the Wide byte SendMessage..ie for Wide Characters, have you tried the normal Sendmessage.. public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

    I also notice it's like as if you are trying to change the value based on the handle of the richtextbox's control hence the looking around for the AOL's client window in another process...is that correct?

    That could be the source of the problem, directly modifying a control that belongs to a window that is not yours (your program is managed, modifying a unmanaged process's window)...that could explain why it crashed. Can you clarify what is the hex constants for?

    Edit: When you use the WM_GETTEXTLENGTH and WM_GETTEXT, they are part of the Windows Messages to retrieve the text length and the actual text from the control. If you look here and see what pinvoke.net has to say about them..When you issue a 'SendMessage', with WM_GETTEXTLENGTH and WM_GETTEXT, you are telling Windows - 'Hey, get me the length of the text in that associated handle which I've given you in the parameter n. Just occurred to me, worth trying out...I would get rid of those SendMessage pinvokes and use just this one..

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
    //If you use '[Out] StringBuilder', initialize the string builder with proper length first.
    
    
    child = FindClientWindow();
    room = FindChildByClass(child, "RICHCNTLREADONLY");
    
    length = SendMessage(n, 0x000E, IntPtr.Zero, IntPtr.Zero);
    
    StringBuilder sbBuf = new StringBuilder(length);
    
    SendMessageByString(room, 0x000D, new IntPtr( length.ToInt32() + 1 ), out sbBuf); // this is the line that keeps crashing on me.
    

    Try that and get back here ... :)

    Hope this helps, Best regards, Tom.

提交回复
热议问题