¿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