- Offizieller Beitrag
In Anlehnung an dieses Thema wollte ich mal probieren die Scintilla-interne Messagefunktion zu nutzen.
Aber C/C++ ist nicht meine Baustelle, da gerät Portieren zur reinen Raterei. Kann mir jemand sagen, wie man das in AutoIt umsetzt (falls es überhaupt geht)?
C
On Windows, the message-passing scheme used to communicate between the container and Scintilla is mediated by the operating system SendMessage function and can lead to bad performance when calling intensively. To avoid this overhead, Scintilla provides messages that allow you to call the Scintilla message function directly. The code to do this in C/C++ is of the form:
#include "Scintilla.h"
SciFnDirect pSciMsg = (SciFnDirect)SendMessage(hSciWnd, SCI_GETDIRECTFUNCTION, 0, 0);
sptr_t pSciWndData = (sptr_t)SendMessage(hSciWnd, SCI_GETDIRECTPOINTER, 0, 0);
// now a wrapper to call Scintilla directly
sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
return pSciMsg(pSciWndData, iMessage, wParam, lParam);
}
SciFnDirect, sptr_t and uptr_t are declared in Scintilla.h. hSciWnd is the window handle returned when you created the Scintilla window.
While faster, this direct calling will cause problems if performed from a different thread to the native thread of the Scintilla window in which case SendMessage(hSciWnd, SCI_*, wParam, lParam) should be used to synchronize with the window's thread.
Alles anzeigen
Hier mein Versuch:
AutoIt
#include <SendMessage.au3>
Global Const $SCI_GETDIRECTFUNCTION = 2184
Global Const $SCI_GETDIRECTPOINTER = 2185
Global Const $SCI_GETCURLINE = 2027
; Handle des Editors ermitteln
Global $hWndSciTE = WinGetHandle('[Class:SciTEWindow]')
Global $hWndSciTEEditor = ControlGetHandle($hWndSciTE, '', '[Class:Scintilla;Instance:1]')
;===================================================================================================
Global $pSciMsg = Ptr(_SendMessage($hWndSciTEEditor, $SCI_GETDIRECTFUNCTION))
Global $pSciWndData = Ptr(_SendMessage($hWndSciTEEditor, $SCI_GETDIRECTPOINTER))
Func CallScintilla($iMessage, $wParam, $lParam)
Return $pSciMsg($pSciWndData, $iMessage, $wParam, $lParam)
EndFunc
;===================================================================================================
Global $iLen = CallScintilla($SCI_GETCURLINE, 0, 0)
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $iLen --> " & $iLen & @LF)
; ERROR
; ==> Variable cannot be accessed in this manner.:
; Return $pSciMsg($pSciWndData, $iMessage, $wParam, $lParam)
; Return $pSciMsg^ ERROR
Alles anzeigen