Jump to content

Get Access to RichEdit (Log) in PSPad with Autoit


Recommended Posts

Hey there!

I'm gonna try to get access to an RichEdit Control in PSPad with Autoit which is scripted with Delphi. I wrote the commands out ouf the RichEdit.au3 UDF to can change them, because it always fails or crashs, when i call it. I Just want to set the Textcolor for the RichEdit.

It seems to be a Problem with $EM_SETCHARFORMAT... (maybe protected?) I can use e.g. $EM_SETBKGNDCOLOR or other messages with no error. Sadly it doesn't exist a message constant to just set the textcolor... This is what i already tried:

  • use $EM_GETCHARFORMAT but it crashs/doesn't work too.
  • I saw the riched20.dll is linked to GDI+ but i couldn't make something work with it... (GetDc and so on but maybe there is another way?)
  • Tried to set some other style on it (setWindowLong)

I read the MSDN about $EM_SETCHARFORMAT up and down, but i can't find any other solution.

The RichEdit should be version 2 ( error message point to riched20.dll )

 

Here is the PSPad that will be required for testing:

https://autoit.de/wcf/attachment/87712-pspad4autoit3-v1-0-0-beta-without-setup-zip/

You need to start PSPad.exe first!

; = Info ===========================================================================================
; Title           : RichEdit_Test
; --------------------------------------------------------------------------------------------------
;
; Version (vnots) : 0.0.1
; Date            : 2020-05-13
; Author(s)       : Aelc
;
; ==================================================================================================
#include <File.au3>
#include <Misc.au3>
#include <Date.au3>
#include <String.au3>
#include <GuiListBox.au3>
#include <WinAPI.au3>
#include <MsgBoxConstants.au3>
#include <Color.au3>

#include <GuiRichEdit.au3>
#include <EditConstants.au3>

AutoItSetOption("MustDeclareVars", 1)


RichEdit_Test_Main()


Func RichEdit_Test_Main()

    Local $hPSPad = Null
    Local $tLogCtrls
    Local $hLB_hwnd
    Local $hLB_ID

    $hPSPad = _WinAPI_GetForegroundWindow()
    If Not WinExists("[CLASS:TfPSPad]") Then
        MsgBox ( 48,"","PSPad not found." )
        Exit
    EndIf

    Sleep(1000)
    $hPSPad = WinGetHandle("[CLASS:TfPSPad]")

;~  If $hPSPad = Null Then
;~      MsgBox($MB_SYSTEMMODAL + $MB_ICONWARNING, 'AutoIt3_CompilerRunner: - Error -', 'No handle found for PSPad!')
;~      Exit (2) ; 2 = PSPad-hwnd not found
;~  EndIf

    If _WinAPI_IsClassName($hPSPad, "TfPSPad") Then

        ; --------------------------------------------------------------------------
        If _Singleton("PSPad->RichEdit_Test " & String($hPSPad), 1) = 0 Then
            MsgBox($MB_SYSTEMMODAL + $MB_ICONERROR, "RichEdit_Test: - Error -", _
                    '"RichEdit_Test" is already running')
            Exit
        EndIf
        ; --------------------------------------------------------------------------

        $tLogCtrls = PSPad_GetLogControls($hPSPad, 'Log')
        $hLB_hwnd = $tLogCtrls.hWnd_ListBox
        $hLB_ID = $tLogCtrls.ID_ListBox
        If $hLB_hwnd > 0 Then
        _SendMessage($hLB_hwnd, 0xCF,False) ;Set $READONLY to False
        Local $tagCHARFORMAT_changeable = "struct;uint cbSize;long dwMask;long dwEffects;long yHeight;long yOffset;INT crTextColor;" & _
                "byte bCharSet;byte bPitchAndFamily;wchar szFaceName[32];endstruct"
        Local $aColor[3] = [0xFF, 0x00, 0xFF]
        Local $nColor = _ColorSetCOLORREF($aColor)
        Local $tCharFormat = DllStructCreate($tagCHARFORMAT_changeable)
        DllStructSetData($tCharFormat, 1, DllStructGetSize($tCharFormat))
        DllStructSetData($tCharFormat, 2, $CFM_COLOR)
        DllStructSetData($tCharFormat, 6, $nColor)
        MsgBox ( 64,"",_SendMessage($hLB_hwnd, $EM_SETCHARFORMAT, $SCF_SELECTION, $tCharFormat, 0, "wparam", "struct*"))
        Else ; Log-Fenster konnte nicht gefunden werden.
            MsgBox($MB_SYSTEMMODAL + $MB_ICONERROR, "AutoIt3_CompilerRunner: - Error -", _
                    "The log window of PSPad could not be found.")
            Exit
        EndIf

    Else
    EndIf
EndFunc   ;==>RichEdit_Test_Main

;~ Func _RichEditGetTextLength($hWnd)
;~  If Not _WinAPI_IsClassName($hWnd, $__g_sRTFClassName) Then Return SetError(101, 0, 0)
;~  Local $bChars = True
;~  Local $bExact = True
;~  Local $tGetTextLen = DllStructCreate($tagGETTEXTLENGTHEX)
;~  Local $iFlags = BitOR($GTL_USECRLF, ($bExact ? $GTL_PRECISE : $GTL_CLOSE))
;~  $iFlags = BitOR($iFlags, ($bChars ? $GTL_DEFAULT : $GTL_NUMBYTES))
;~  DllStructSetData($tGetTextLen, 1, $iFlags)
;~  DllStructSetData($tGetTextLen, 2, ($bChars ? $CP_ACP : $CP_UNICODE))
;~  Local $iRet = _SendMessage($hWnd, $EM_GETTEXTLENGTHEX, $tGetTextLen, 0, 0, "struct*")
;~  Return $iRet
;~ EndFunc   ;==>_RichEditGetTextLength

;~ Func _RichEditGetBKColor($hWnd)
;~  If Not _WinAPI_IsClassName($hWnd, $__g_sRTFClassName) Then Return SetError(101, 0, 0)
;~  Local $iBkColor = _SendMessage($hWnd, $EM_SETBKGNDCOLOR, False, 0)
;~  _SendMessage($hWnd, $EM_SETBKGNDCOLOR, False, $iBkColor)
;~  Return $iBkColor
;~ EndFunc   ;==>_RichEditGetBKColor

;~ Func _RichEditSetBKColor($hWnd, $iBkColor)
;~  If Not _WinAPI_IsClassName($hWnd, $__g_sRTFClassName) Then Return SetError(101, 0, 0)
;~  _SendMessage($hWnd, $EM_SETBKGNDCOLOR, False, $iBkColor)
;~  Return $iBkColor
;~ EndFunc   ;==>_RichEditSetBKColor

Func PSPad_GetLogControls($_hPSPad, $_sSheetText = 'Log')

    Local $sStruct_LogCtrls = _
            'hwnd hWnd_PageControl;' & _ ; TPageControl
            'int ID_PageControl;' & _
            'hwnd hWnd_TabSheet;' & _ ; TTabSheet
            'int ID_TabSheet;' & _
            'hwnd hWnd_ListBox;' & _ ; TListBox
            'int ID_ListBox;'
    Local $tResult = DllStructCreate($sStruct_LogCtrls)
    Local $aEnum
    Local $sSheet
    Local $i, $x
    $aEnum = _WinAPI_EnumChildWindows($_hPSPad, False)
    If IsArray($aEnum) Then
        For $i = 1 To $aEnum[0][0]
            If $aEnum[$i][1] = "TTabSheet" Then
                $sSheet = ControlGetText($_hPSPad, '', _WinAPI_GetDlgCtrlID($aEnum[$i][0]))
                If $sSheet = $_sSheetText Then ; TabSheet gefunden.
                    $tResult.hWnd_TabSheet = $aEnum[$i][0]
                    $tResult.ID_TabSheet = _WinAPI_GetDlgCtrlID($tResult.hWnd_TabSheet)
                    $tResult.hWnd_PageControl = _WinAPI_GetParent($tResult.hWnd_TabSheet)
                    $tResult.ID_PageControl = _WinAPI_GetDlgCtrlID($tResult.hWnd_PageControl)
                    For $x = $i + 1 To $aEnum[0][0]
                        If $aEnum[$x][1] = "TRichEdit" Then
                            $tResult.hWnd_ListBox = $aEnum[$x][0]
                            $tResult.ID_ListBox = _WinAPI_GetDlgCtrlID($tResult.hWnd_ListBox)
                            Return $tResult ; Wenn gefunden, dann raus aus der Funktion.
                        EndIf
                    Next
                EndIf
            EndIf
        Next
    EndIf
    Return $tResult
EndFunc   ;==>PSPad_GetLogControls

I don't have any ideas anymore :( But maybe someone else has?

I would be happy for every idea :P 

 

Thanks in advance

why do i get garbage when i buy garbage bags? <_<

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...