Ich möchte für ein kleines Hilfstool direkt mit dem Scintilla-Control in Notepad++ komunizieren. Mit allen Commands, die Werte per Return zurückgeben, funktioniert das auch. Das sind allerdings nur Integer-Werte, für Strings muß eine DLL-Struct übergeben werden und die bleibt leer. Ich vermute, daß das mit den getrennten Speicherbereichen von Prozessen zu tun hat, daß Scintilla also nicht in die von meinem Script bereitgestellte Struct schreiben kann. Gibt es dafür eine Lösung, oder ist das "by design" so gewollt, daß das nicht geht?
Könnten da vielleicht WM_COPYDATA oder das NomadMemory-UDF mir da weiterhelfen?
Beispielcode:
AutoIt
Global $NPPhwnd, $NPPselected
Global Const $SCI_GETSELTEXT=2161
$NPPhwnd = WinGetHandle("[Active;CLASS:Notepad++]")
Global $ScintillaClassNameNN = ControlGetFocus($NPPhwnd)
Global $ScintillaHwnd = ControlGetHandle($NPPhwnd,"",$ScintillaClassNameNN)
ConsoleWrite(SCI_GETSELTEXT($ScintillaHwnd))
Func SCI_GETSELTEXT($Sci)
Local $ret, $sText=""
$iLen = DllCall("user32.dll","long","SendMessageA","hwnd",$Sci,"int",$SCI_GETSELTEXT,"int",0,"int",0)
If @error Then Return -1
$sBuf = DllStructCreate("byte[" & $iLen[0] & "]")
If @error Then Return -2
$ret = DllCall("user32.dll","long","SendMessageA","long",$Sci,"int",$SCI_GETSELTEXT,"int",0,"ptr",DllStructGetPtr($sBuf))
If @error Then Return -3
$sText = BinaryToString(DllStructGetData($sBuf, 1))
$sBuf = 0
If @error Then Return -4
Return $sText
EndFunc
Alles anzeigen