Connecting to Paltalk Room without the “Room” text in title

He so Paltalk 11.5 update no longer has the “Room” on the paltalk rooms title. so the program in VB6 are not able to connect that way using this code.

Public Function FindPalRooms(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim retVal As Long, ProcessID As Long, ThreadID As Long
Dim WinClassBuf As String * 255, WinTitleBuf As String * 255
Dim WinClass As String, WinTitle As String

    retVal = GetClassName(lhWnd, WinClassBuf, 255)
    WinClass = StripNulls(WinClassBuf)  ' remove extra Nulls & spaces
    retVal = GetWindowText(lhWnd, WinTitleBuf, 255)
    WinTitle = StripNulls(WinTitleBuf)
    
    'Added so text is sent only to chat room and not to pm
    If LCase(WinClass) = LCase(mTargetWinClass) Then
       If InStr(1, WinTitle, " Room", vbTextCompare) <> 0 Then
           Form1.Combo1.AddItem (WinTitle)
       End If
    End If
    
    FindPalRooms = True
End Function

So we need to find another way, it prob easy but if anyone has a easy solution post it here Thanks 🙂

17 thoughts on “Connecting to Paltalk Room without the “Room” text in title

  1. K I am able to get then using something I was using to get the windows title for PMs like this. Still using the combobox.

    Function

    Private Function GetText(Get_hWnd As Long) As String
    Dim lenTxt As Long, retText As String
    
    lenTxt = GetWindowTextLength(Get_hWnd) + 1
    
    retText = String$(lenTxt, " ")
    GetWindowText Get_hWnd, retText, lenTxt
    
    GetText = retText
    
    End Function

    Call it with

    Combo1.Clear
    Combo1.AddItem GetText(FindWindow("dlggroupchat window class", vbNullString))
    Combo1.ListIndex = 0

    It work’s but the shit gets what ever is focus PM or Room 🙂

  2. User list is invisible in IM window, check this code.

    Imports System.Text
    
    Module Module4
        Public Declare Auto Function FindWindow Lib "User32.dll" _
            (ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    
        Public Declare Auto Function GetWindowThreadProcessId Lib "User32.dll" _
            (ByVal hWnd As IntPtr, Optional ByRef lpdwProcessId As ULong = Nothing) As Integer
    
        Public Delegate Function WNDENUMPROC(ByVal hwnd As IntPtr, ByVal lParam As Object) As Boolean
    
        Public Declare Auto Function EnumThreadWindows Lib "user32.dll" _
            (ByVal dwThreadId As Integer, ByVal lpfn As WNDENUMPROC, ByRef lParam As Object) As Boolean
    
        Public Delegate Function EnumChildindowsProc(ByVal Handle As IntPtr, ByVal lParam As Object) As Boolean
    
        Public Declare Auto Function EnumChildWindows Lib "User32.dll" _
               (ByVal hwnd As IntPtr, ByVal Callback As EnumChildindowsProc, ByVal lParam As Object) As Boolean
    
        Public Declare Auto Function GetClassName Lib "User32.dll" _
            (hWnd As IntPtr, lpClassName As StringBuilder, ByVal nMaxCount As UInteger) As Integer
    
        Public Declare Auto Function GetDlgCtrlID Lib "User32.dll" _
            (ByVal hwnd As IntPtr) As Integer
    
        Public Declare Auto Function IsWindowVisible Lib "User32.dll" _
            (hwnd As IntPtr) As Boolean
    
        Declare Auto Function GetWindowText Lib "User32.dll" _
            (hWnd As IntPtr, lpString As StringBuilder, ByVal nMaxCount As Integer) As Integer
    
        Enum ChatType
            IM
            Room
        End Enum
        Class ChatWindow
            Sub New()
                type = ChatType.IM
                hwndText = 0
                hwndInput = 0
                hwndUsers = 0
            End Sub
    
            Public type As ChatType
            Public title As String
            Public hwndText As Long
            Public hwndInput As Long
            Public hwndUsers As Long
        End Class
    
        Function EnumChatChildindows(ByVal hwnd As IntPtr, ByVal lParam As ChatWindow) As Boolean
            Dim ctlID = GetDlgCtrlID(hwnd)
            Select Case ctlID
                Case &H6FD
                    If IsWindowVisible(hwnd) Then
                        lParam.hwndUsers = hwnd
                        lParam.type = ChatType.Room
                    End If
                Case &HCA
                    lParam.hwndText = hwnd
                Case &HCB
                    lParam.hwndInput = hwnd
            End Select
            Return True
        End Function
    
        Function EnumChatWindows(ByVal hwnd As IntPtr, ByVal lParam As ArrayList) As Boolean
            Dim sb As New StringBuilder(128)
            If GetClassName(hwnd, sb, sb.Capacity) = 0 Then Return True
            If sb.ToString() = "DlgGroupChat Window Class" Then
                Dim window As ChatWindow = New ChatWindow
                EnumChildWindows(hwnd, AddressOf EnumChatChildindows, window)
                If window.hwndInput <> 0 Then
                    GetWindowText(hwnd, sb, sb.Capacity)
                    window.title = sb.ToString()
                    lParam.Add(window)
                End If
            End If
            Return True
        End Function
    
        Sub main()
            Dim hwnd = FindWindow("SEINFELD_SUPERMAN", vbNullString)
            Dim dwThreadID As ULong = GetWindowThreadProcessId(hwnd)
            Dim myWindows = New ArrayList
            EnumThreadWindows(dwThreadID, AddressOf EnumChatWindows, myWindows)
        End Sub
    
    
    End Module
    

    A simplified vers. to just check if the window is a chatroom

        Class bool
            Sub New()
                isTrue = False
            End Sub
            Public isTrue As Boolean
        End Class
    
        Function EnumChatChildindows(ByVal hwnd As IntPtr, ByVal lParam As bool) As Boolean
            If GetDlgCtrlID(hwnd) = &H6FD Then
                lParam.isTrue = IsWindowVisible(hwnd)
                Return False
            End If
            Return True
        End Function
    
        Public Function IsChatWindow(hwnd As IntPtr) As Boolean
            Dim isChat As New bool
            EnumChildWindows(hwnd, AddressOf EnumChatChildindows, isChat)
            Return isChat.isTrue
        End Function
    

     

  3. It’s the same method we use to find controlls only changed a bit to identify chat room.

    Using the 1st code before oppening the room selector you can already have the controlls.

  4. Okay what if I change ” Room” to Just “” FindPalRooms Function
    and it will look like this

    Public Function FindPalRooms(ByVal lhWnd As Long, ByVal lParam As Long) As Long
    Dim retVal As Long, ProcessID As Long, ThreadID As Long
    Dim WinClassBuf As String * 255, WinTitleBuf As String * 255
    Dim WinClass As String, WinTitle As String
    
        retVal = GetClassName(lhWnd, WinClassBuf, 255)
        WinClass = StripNulls(WinClassBuf)  ' remove extra Nulls & spaces
        retVal = GetWindowText(lhWnd, WinTitleBuf, 255)
        WinTitle = StripNulls(WinTitleBuf)
        
        'Added so text is sent only to chat room and not to pm
        If LCase(WinClass) = LCase(mTargetWinClass) Then
           If InStr(1, WinTitle, "", vbTextCompare) <> 0 Then
               Form1.Combo1.AddItem (WinTitle)
           End If
        End If
        
        FindPalRooms = True
    End Function

    It works but will it have any implications, besides connecting to either the room or PM?

  5. Something like this, haven’t even try to compile it.

    Declare Function EnumChildWindows Lib "User32.dll" _
    	(ByVal hwnd As Integer, ByVal Callback As Integer, ByRef lParam As Any) As Integer
    
    Declare Function IsWindowVisible Lib "User32.dll" _
    	(ByVal hwnd As Integer) As Integer
    
    Declare Function GetDlgCtrlID(ByVal hwnd as Integer) As Integer
    	
    Function EnumChatChildindows(ByVal hwnd As Integer, ByRef lParam As Boolean) As Integer
    	If GetDlgCtrlID(hwnd) = &H6FD Then
    		lParam = IsWindowVisible(hwnd) <> 0
    		EnumChatChildindows = 0
    	End If
    	EnumChatChildindows = 1
    End Function
    
    Function IsChatWindow(hwnd As Integer) As Boolean
    	Dim isChat As Boolean
    	isChat = False
    	EnumChildWindows(hwnd, AddressOf EnumChatChildindows, isChat)
    	IsChatWindow = isChat
    End Function

     

  6. It looks like Paltalk made changes again !! I hope my stuffs still work, ’cause my old computer just crashed I might not have the old library code anymore. Unless I have to reverse engineer.

  7. It’s the same method we use to find controlls only changed a bit to identify chat room. Using the 1st code before oppening the room selector you can already have the controlls.

    yeah I see that, but logic dictates that if there is no Roomlist(dlgId) then its a pm window else it must be a room.

     

    btw I found a nice little delphi sample on streaming RTF text to other applications, it not too far off what we use now but there is some intersting flags and callbacks

    It is in Delphi but im sure you will no problems understanding it..

    implementation
    
    uses CommonMemoryUnit;
    
    {$R *.DFM}
    
    type
      PSetTextEx = ^TSetTextEx;
      tagSetTextEx = record
        flags : DWORD;
        codepage : UINT;
      end;
      TSetTextEx = tagSetTextEx;
      SETTEXTEX = tagSetTextEx;
    
    const
      EM_SETTEXTEX = WM_USER + 97;
      ST_DEFAULT   = 0;
      ST_KEEPUNDO  = 1;
      ST_SELECTION = 2;
      ST_NEWCHARS  = 4;
      ST_UNICODE   = 3;
    
    var
      FStreamRec : TEditStream;
      FStream    : TStringStream;
    
    //-------------------------------------------------- ---------------------------
    //  EM_STREAMOUT message for callback function
    //-------------------------------------------------- ---------------------------
    function EditStreamCallBack(dwCookie: Longint; pbBuff: PByte;
        cb: Longint; var pcb: Longint): Longint; stdcall;
    begin
      try
        pcb := FStream.Write(pbBuff^, cb);
        Result:= 0;
      except
        Result:= 1;
      end;
    end;
    
    //================================================== ===========================
    //  Display in TRichEdit reads the rich text file
    //================================================== ===========================
    procedure TForm1.Button1Click(Sender: TObject);
    var
      AFilePath : String;
    begin
      OpenDialog1.Filter := 'RTFファイル|*.RTF';
      if InitDir = '' then begin
        OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
      end;
      if OpenDialog1.Execute then begin
        AFilePath := OpenDialog1.FileName;
        RichEdit1.Lines.LoadFromFile(AFilePath);
      end;
    end;
    
    //================================================== ===========================
    //  Transfer the rich text without using the clipboard to other TRichEdit
    //
    //  Use EM_SETTEXTEX message
    //  Since there is no definition in Delphi XE, defined and used with the required structure
    //
    //  The use of shared memory class CommonMemoryUnit of Halbow museum
    //================================================== ===========================
    procedure TForm1.Button2Click(Sender: TObject);
    var
      Flags      : Integer;
      hTargetApp : HWND;
      hRich      : HWND;
      SetTextRec : TSetTextEx;
      CM         : TCommMemNT;
      CMRec      : TCommMemNT;
      StrSize    : Cardinal;
      StrText    : AnsiString;
    begin
      //Get on the receiving side of the app handle
      hTargetApp := FindWindow(nil, 'TargetForm');
      if hTargetApp = 0 then exit;
    
      //Get on the receiving side of the RichEdit handle
      hRich := FindWindowEx(hTargetApp, 0, 'TRichEdit', nil);
      if hRich = 0 then exit;
    
      //Set the flag to be used in EM_STREAMOUT Create a TStringStream
      FStream := TStringStream.Create('');
      if RichEdit1.SelLength = 0 then begin
        Flags := SF_RTF or SFF_PLAINRTF;
      end else begin
        Flags := SF_RTF or SFF_PLAINRTF or SFF_SELECTION;
      end;
      //By specifying processing a callback function to be used in EM_STREAMOUT
      //When you return or callback function, rich text is stored in FStream
      FStreamRec.pfnCallback := @EditStreamCallBack;
      RichEdit1.Perform(EM_STREAMOUT, Flags, Longint(@FStreamRec));
    
      //Convert the data of the stream in the string to an AnsiString
      //Argument of EM_SETTEXTEX must be AnsiString
      StrText := AnsiString(FStream.DataString);
      StrSize := Length(StrText);
    
      //To generate a shared memory class
      CM    := TCommMemNT.Create(hTargetApp, StrSize);
      CMRec := TCommMemNT.Create(hTargetApp, 100);
      try
        //Stores transfer data to the shared memory
        CM.Write(0, Pointer(StrText), StrSize);
    
        //Set the transfer flag
        //flags Paste operation varies depending on the value of the receiving side (overwrite Toka Toka inserted)
        SetTextRec.flags    := ST_DEFAULT;
        SetTextRec.codepage := CP_ACP;
        CMRec.Write(0, @SetTextRec, SizeOf(SetTextRec));
        //Run transfer message
        SendMessage(hRich, EM_SETTEXTEX, WPARAM(CMRec.MemPtr), LPARAM(CM.MemPtr));
      finally
        CM.Free;
        CMRec.Free;
        FStream.Free;
      end;
    end;
    
    end.

     

    the only I need to check out for the shared memory part is the reference to “CommonMemoryUnit” its not a default unit in delphi

  8. yeah I see that, but logic dictates that if there is no Roomlist(dlgId) then its a pm window else it must be a room.

    btw I found a nice little delphi sample on streaming RTF text to other applications, it not too far off what we use now but there is some intersting flags and callbacks

    It is in Delphi but im sure you will no problems understanding it..

    the only I need to check out for the shared memory part is the reference to “CommonMemoryUnit” its not a default unit in delphi

    Bothe the code and data need to be in the other application, I’ve posted it long time ago
    https://www.imfiles.com/topic/another-way-to-save-paltalk-text/

  9. I do remember that code you posted now that you mentioned it. I have tried the code I posted on paltalk and it works very good, but for me personally I don’t see the need for the overhead as my current method does the job, Currently I have to convert the rtf to a simple memory stream to keep the formatting when sending to paltalk, then I can use the standard WM_SETTEXT to actually send the formatted text.

     

    procedure TPalWindow.SendPalRTF(aRichEdit: TRichedit);
    var
      memStream: TMemoryStream;
      strList: TStringList;
    begin
        memStream := TMemoryStream.Create;
        strList := TStringList.Create;
        try
          memStream.Clear;
          aRichEdit.Lines.SaveToStream(memStream);
          memStream.Position := 0;
          strList.Clear;
          strList.LoadFromStream(memStream);
          SendText(AnsiString(strList.Text));
        finally
          memStream.Free;
          strList.Free;
        end;
    end;
  10. I do remember that code you posted now that you mentioned it. I have tried the code I posted on paltalk and it works very good, but for me personally I don’t see the need for the overhead as my current method does the job, Currently I have to convert the rtf to a simple memory stream to keep the formatting when sending to paltalk, then I can use the standard WM_SETTEXT to actually send the formatted text.

    My code was to stream the text from pal not to pal to preserve the text the user entered without using the clipboard.
    The code you have posted does not stream the text to the other application and I’m not sure WM_SETTEXT will work by default with every application.

Leave a Reply

You must Register or Login to comment on Connecting to Paltalk Room without the “Room” text in title