¿Encontrar y usar el Chatbox actualmente activo en el Cliente Skype a través de WinAPI y Delphi?

En Delphi, mediante el uso de la API de Skype, puedo enviar un mensaje a un contacto con bastante facilidad. Sin embargo, lo que estoy tratando de hacer es ingresar el mensaje en el cuadro de chat del contacto actualmente enfocado, sin enviar el mensaje.

Al usar Winspector, descubrí que el nombre de clase del Chatbox es TChatRichEdit, que se coloca en un TChatEntryControl, que se coloca en un TConversationForm, y finalmente, que se coloca en el tSkMainForm. (Obviamente, el cliente de Skype está codificado en Delphi;))

Usando la API Win, ¿cómo puedo encontrar la @ correcttSkMainForm> TConversationForm> TChatEntryControl> TChatRichEdit, y luego ingrese un mensaje en él?

Cuál sería la mejor manera de hacer esto?

Además, el TConversationForm también contiene el nombre del contacto, ¿así que supongo que eso lo hace un poco más fácil?

EDIT: Aquí hay una captura de pantalla de Windspector Spy, que muestra el TChatRichEdit:

Aquí está mi código actual

function GetConversationWindow(Wnd: HWnd; P: LParam): Bool; stdcall;
var
  Param: PGetConversationParam;
  ProcID: DWord;
  // WndClass docs say maximum class-name length is 256.
  ClassName: array[0..256] of Char;
  WindowTitle: array[0..256] of Char;
begin
  Result := True; // assume it doesn't match; keep searching
  Param := PGetConversationParam(P);

  GetWindowThreadProcessID(Wnd, @ProcID);
  if ProcID <> Param.ProcID then
    Exit;

  if GetClassName(Wnd, ClassName, Length(ClassName)) = 0 then
    Exit;
  if StrComp(ClassName, 'TConversationForm') <> 0 then
    Exit;

  if SendMessage(Wnd, wm_GetText, Length(WindowTitle), LParam(@WindowTitle[0])) = 0 then
    Exit;
  if Param.ContactName = WindowTitle then begin
    Param.Result := Wnd;
    Result := False;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TGetConversationParam;
  RichEditWnd, ControlWnd : HWND;
  ParentWnd : HWND;
begin
  //Param.ProcID := GetSkypeProcessID;
  Param.ContactName := 'xSky Admin';
  ParentWnd := FindWindowEx(0,0,'tSkMainForm',nil);

  if EnumChildWindows(ParentWnd,@GetConversationWindow, LParam(@Param)) then
    Abort; // Didn't find it.

  // Param.Result holds the conversation window's handle. Now walk its children.
  ControlWnd := FindWindowEx(Param.Result, 0, 'TChatEntryControl', nil);
  if ControlWnd = 0 then
    Abort; // Conversation doesn't have an entry control

  RichEditWnd := FindWindowEx(ControlWnd, 0, 'TChatRichEdit', nil);
  if RichEditWnd = 0 then
    Abort;

  ShowMessage('Got it!');
end;

Nunca llego al ShowMessage.

Aquí hay una captura de pantalla de mi IDE en modo de depuración:

Agregué un punto de interrupción en la línea Abortar.

¿Algunas ideas

Respuestas a la pregunta(2)

Su respuesta a la pregunta