Jump to content

Recommended Posts

Posted

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? <_<

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
×
×
  • Create New...