AZJIO wrote: Tue Nov 29, 2022 4:48 am
Make a copy of the code so we can use it for screenshots
Comes With No Warranty! lol this is still incomplete/work in progress. Trying to convert from an older wts library and still undergoing testing on some stuff.
Code: Select all
;=======================Terminal/Remote Desktop Services=======================;
EnableExplicit
Import"Wtsapi32.lib":WTSQueryUserToken(SessionId,phToken):EndImport
Import"Wtsapi32.lib":WTSEnumerateSessionsW(hServer,Reserved,Version,*ppSessionInfo,*pCount):EndImport
Import"Wtsapi32.lib":WTSQuerySessionInformationW(hServer,SessionId,WtsInfoClass,*ppBuffer,*pBytesReturned):EndImport
Import"Wtsapi32.lib":WTSRegisterSessionNotification(hWnd,dwFlags):EndImport
Import"Wtsapi32.lib":WTSEnumerateSessionsExW(hServer,*pLevel,Filter,*ppSessionInfo,*pCount):EndImport
Import"Wtsapi32.lib":WTSFreeMemory(pMemory):EndImport
Import"Kernel32.lib":WTSGetActiveConsoleSessionId():EndImport
#WTS_CURRENT_SERVER_HANDLE = 0 : #WTS_CURRENT_SESSION = -1
#AF_UNSPEC = 0 : #AF_INET = 2
#AF_IPX = 6 : #AF_NETBIOS = 17
#AF_INET6 = 23 : #ES_CONTINUOUS = $80000000
#ES_DISPLAY_REQUIRED = $00000002 : #ES_SYSTEM_REQUIRED = $00000001
#AWAYMODE_REQUIRED = $00000040 :
Enumeration WTS_SESSION_CHANGE
#WTS_CONSOLE_CONNECT = 1
#WTS_CONSOLE_DISCONNECT
#WTS_REMOTE_CONNECT
#WTS_REMOTE_DISCONNECT
#WTS_SESSION_LOGON
#WTS_SESSION_LOGOFF
#WTS_SESSION_LOCK
#WTS_SESSION_UNLOCK
#WTS_SESSION_REMOTE_CONTROL
#WTS_SESSION_CREATE
#WTS_SESSION_TERMINATE
EndEnumeration
Enumeration WTS_INFO_CLASS
#WTSInitialProgram=0
#WTSApplicationName
#WTSWorkingDirectory
#WTSOEMId
#WTSSessionId
#WTSUserName
#WTSWinStationName
#WTSDomainName
#WTSConnectState
#WTSClientBuildNumber
#WTSClientName
#WTSClientDirectory
#WTSClientProductId
#WTSClientHardwareId
#WTSClientAddress
#WTSClientDisplay
#WTSClientProtocolType
#WTSIdleTime
#WTSLogonTime
#WTSIncomingBytes
#WTSOutgoingBytes
#WTSIncomingFrames
#WTSOutgoingFrames
#WTSClientInfo
#WTSSessionInfo
#WTSSessionInfoEx
#WTSConfigInfo
#WTSValidationInfo
#WTSSessionAddressV4
#WTSIsRemoteSession
EndEnumeration
Enumeration WTS_CONNECTSTATE_CLASS
#WTSActive
#WTSConnected
#WTSConnectQuery
#WTSShadow
#WTSDisconnected
#WTSIdle
#WTSListen
#WTSReset
#WTSDown
#WTSInit
EndEnumeration
Enumeration WTS_TYPE_CLASS
#WTSTypeProcessInfoLevel0
#WTSTypeProcessInfoLevel1
#WTSTypeSessionInfoLevel1
EndEnumeration
Structure WTS_CLIENT_ADDRESS Align #PB_Structure_AlignC
AddressFamily.l
byte.b[20]
EndStructure
Structure WTS_SESSION_INFOW Align #PB_Structure_AlignC
SessionId.l
*pWinStationName
State.l
EndStructure
Structure WTS_SESSION_INFO_1W Align #PB_Structure_AlignC
ExecEnvId.l;
State.l
SessionId.l
*pSessionName
*pHostName
*pUserName
*pDomainName
*pFarmName
EndStructure
Macro StatusText(StatusCode,StatusString)
StatusString = "Unknown Status"
Select StatusCode
Case #WTSActive : StatusString = "Active"
Case #WTSConnected : StatusString = "Connected"
Case #WTSConnectQuery : StatusString = "Connecting"
Case #WTSShadow : StatusString = "Shadow"
Case #WTSDisconnected : StatusString = "Disconnected"
Case #WTSIdle : StatusString = "Idle"
Case #WTSListen : StatusString = "Listening"
Case #WTSReset : StatusString = "Resetting"
Case #WTSDown : StatusString = "Down"
Case #WTSInit : StatusString = "Initializing"
EndSelect
EndMacro
Procedure.s WTSGetFullUserName(SessionId=#WTS_CURRENT_SESSION,hWTS=#WTS_CURRENT_SERVER_HANDLE)
Protected bytes,L,U$,D$,Q,*U=AllocateMemory(522),*D=AllocateMemory(522)
Q=WTSQuerySessionInformationW(hWTS,SessionId,#WTSUserName, @*U, @bytes):L=MemoryStringLength(*U):U$=PeekS(*U,L):WTSFreeMemory(*U)
Q=WTSQuerySessionInformationW(hWTS,SessionId,#WTSDomainName,@*D,@bytes):L=MemoryStringLength(*D):D$=PeekS(*D,L):WTSFreeMemory(*D)
If D$<>"":ProcedureReturn(D$+"\"+U$):Else:ProcedureReturn(U$):EndIf
EndProcedure
;Debug WTSGetFullUserName()
Procedure.s WTSGetClientAddress(WinStationName$,State,SessionId,hWTS=#WTS_CURRENT_SERVER_HANDLE)
Protected R$="",bytes.l,*addr.WTS_CLIENT_ADDRESS=AllocateStructure(WTS_CLIENT_ADDRESS),Q
If FindString(WinStationName$,"RDP-Tcp")
Q=WTSQuerySessionInformationW(hWTS,SessionId,#WTSClientAddress,@*addr,@bytes)
If Q:R$=Str(*addr\byte[2]&$FF)+"."+Str(*addr\byte[3]&$FF)+"."+Str(*addr\byte[4]&$FF)+"."+Str(*addr\byte[5]&$FF):EndIf:WTSFreeMemory(*addr)
EndIf
If State=#WTSListen:ProcedureReturn"0.0.0.0":EndIf
ProcedureReturn R$
EndProcedure
Procedure.s WTSGetClientName(WinStationName$,SessionId,hWTS=#WTS_CURRENT_SERVER_HANDLE)
Protected R$="",bytes,*client=AllocateMemory(522),Q,L
Q=WTSQuerySessionInformationW(hWTS,SessionId,#WTSClientName,@*client,@bytes)
If Q:L=MemoryStringLength(*client):R$=PeekS(*client,L):EndIf:WTSFreeMemory(*client)
ProcedureReturn R$
EndProcedure
Procedure.i CountWTSSessions(ActiveOnly=#False,hWTS=#WTS_CURRENT_SERVER_HANDLE)
Protected E,C,*I=AllocateMemory(SizeOf(WTS_SESSION_INFOW))
If Not ActiveOnly : E=WTSEnumerateSessionsW(hWTS,#Null,1,@*I,@C):WTSFreeMemory(*I):ProcedureReturn C
Else:Protected I.WTS_SESSION_INFOW,X,A=0:E=WTSEnumerateSessionsW(hWTS,#Null,1,@*I,@C)
For X=0 To C-1:CopyMemory(*I+SizeOf(WTS_SESSION_INFOW)*X,I,SizeOf(WTS_SESSION_INFOW)):If I\State=0:A+1:EndIf
Next:WTSFreeMemory(*I):ProcedureReturn A
EndIf
EndProcedure
;Debug CountWTSSessions()
Procedure.s WTSEnumSessInfo(hWTS.l=#WTS_CURRENT_SERVER_HANDLE)
Protected R$,C,X,*I=AllocateMemory(SizeOf(WTS_SESSION_INFOW)),WSI.WTS_SESSION_INFOW,E,S$
E=WTSEnumerateSessionsW(hWTS,#Null,1,@*I,@C)
If C : R$=Str(C)+ " Sessions Found."+#CRLF$+#CRLF$
For X = 0 To C-1
CopyMemory(*I+SizeOf(WTS_SESSION_INFOW)*X, WSI, SizeOf(WTS_SESSION_INFOW))
R$+"Result " +Str(X+1)+ " (SessionId: "+Str(WSI\SessionId)+#CRLF$+
"---------------------------------------"+#CRLF$
If FindString(PeekS(WSI\pWinStationName),"RDP-Tcp")
R$+"ClientAddress:"+WTSGetClientAddress(PeekS(WSI\pWinStationName),WSI\State,WSI\SessionId)+#CRLF$
R$+"ClientName:"+WTSGetClientName(PeekS(WSI\pWinStationName),WSI\SessionId)+#CRLF$
EndIf
R$+"UserName: "+WTSGetFullUserName(WSI\SessionId,hWTS)+#CRLF$
R$+"Session Name: " + PeekS(WSI\pWinStationName)+#CRLF$
StatusText(WSI\State,S$):R$+"State: "+S$+#CRLF$+#CRLF$
Next
WTSFreeMemory(*I)
Else
R$="Error! Found No Sessions (Count = 0)"
EndIf
ProcedureReturn R$
EndProcedure
;Debug WTSEnumSessInfo()
Procedure.s WTSEnumSessInfoEx(hWTS.l=#WTS_CURRENT_SERVER_HANDLE)
Protected R$,L=1,F=0,C,X,*I1=AllocateMemory(SizeOf(WTS_SESSION_INFO_1W)),
I1.WTS_SESSION_INFO_1W,E,S$
E=WTSEnumerateSessionsExW(hWTS,@L,F,@*I1,@C)
If C : R$ = Str(C)+ " Sessions Found."+#CRLF$+#CRLF$
For X=0 To C-1
CopyMemory(*I1+SizeOf(WTS_SESSION_INFO_1W)*X,I1,SizeOf(WTS_SESSION_INFO_1W))
R$+"Result "+Str(X+1)+": (SessionId "+Str(I1\SessionId)+")"+#CRLF$+
"---------------------------------------"+#CRLF$
If I1\ExecEnvId :R$+"ExecEnvId: "+Str(I1\ExecEnvId)+#CRLF$:EndIf
If I1\pDomainName :R$+"Domain Name: "+PeekS(I1\pDomainName)+#CRLF$:EndIf
If I1\pFarmName :R$+"Farm Name: "+PeekS(I1\pFarmName)+#CRLF$:EndIf
If I1\pHostName :R$+"HostName: "+PeekS(I1\pHostName)+#CRLF$:EndIf
If I1\pSessionName:R$+"Session Name: "+PeekS(I1\pSessionName)+#CRLF$:EndIf
If I1\pUserName :R$+"UserName: "+PeekS(I1\pUserName)+#CRLF$:EndIf
StatusText(I1\State,S$):R$+"State: "+S$+#CRLF$+#CRLF$
Next:WTSFreeMemory(*I1)
EndIf:ProcedureReturn R$
EndProcedure
;Debug WTSEnumSessInfoEx()
Procedure.i WTSWinCallBack(hWnd, uMsg, WTSEvent, EventSessionID) ; Callback for WTS Session Notify Events.
Protected Result$,Event_SessUser$ = WTSGetFullUserName(EventSessionID)
If uMsg = #WM_WTSSESSION_CHANGE
Select WTSEvent
Case #WTS_CONSOLE_CONNECT:Result$="[ Session Connect -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_CONSOLE_DISCONNECT:Result$="[ Session Disconnect -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_REMOTE_CONNECT:Result$="[ Session Remote Connect -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_REMOTE_DISCONNECT:Result$="[ Session Remote Disconnect -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_SESSION_LOGON:Result$="[ Session Logon -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_SESSION_LOGOFF:Result$="[ Session Logoff -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_SESSION_LOCK:Result$="[ Session Lock -> Session:"+Str(EventSessionID)+" ] "+"("+Event_SessUser$+") "
Case #WTS_SESSION_UNLOCK:Result$="[ Session Unlock -> Session:"+Str(EventSessionID)+" ] "+"("+Event_SessUser$+") "
Case #WTS_SESSION_REMOTE_CONTROL:Result$="[ Session Remote Control -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_SESSION_CREATE:Result$="[ Session Create -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Case #WTS_SESSION_TERMINATE:Result$="[ Session Terminate -> Session:"+Str(EventSessionID)+" ] [User: "+Event_SessUser$+" ]"
Default:Result$="[!] Un-Handled Callback Event -> [WTSEvent="+Hex(WTSEvent)+"] (uMsg="+Hex(uMsg)+")"
EndSelect
Debug Result$
EndIf;:If Trim(Result$)="":Debug Result$:EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
; CompilerIf #PB_Compiler_IsMainFile
; Global WinMain = OpenWindow(#PB_Any, 0, 0, 400, 140, "WinMain", #PB_Window_Invisible)
;
; If WinMain : SetWindowCallback(@WTSWinCallBack())
; Global RegisterWTS = WTSRegisterSessionNotification(WindowID(WinMain),1)
; If Not RegisterWTS : Debug "Error Setting Session Notifications" : EndIf
; Define WindowEvent
; Repeat
; WindowEvent = WaitWindowEvent()
; Delay(1)
; Until WindowEvent = #PB_Event_CloseWindow
; EndIf
; CompilerEndIf
Bonus Content: gui.prefs
Code: Select all
; PureBasic IDE Exported Preferences
;
[Sections]
IncludeShortcuts = 1
IncludeToolbar = 1
IncludeColors = 1
IncludeFolding = 1
;
; Shortcut settings
;
[Shortcuts]
New = CONTROL+COMMAND+24
Open = CONTROL+COMMAND+25
Save = CONTROL+COMMAND+29
SaveAs = 0
SaveAll = 0
Reload = 0
Close = CONTROL+COMMAND+33
CloseAll = 0
DiffCurrent = 0
EncodingPlain = 0
EncodingUtf8 = 0
NewlineWindows = 0
NewlineLinux = 0
NewlineMacOS = 0
Preferences = CONTROL+COMMAND+26
EditHistory = 0
Quit = 0
Undo = CONTROL+COMMAND+36
Redo = CONTROL+COMMAND+35
Cut = CONTROL+COMMAND+34
Copy = CONTROL+COMMAND+13
Paste = CONTROL+COMMAND+32
PasteComment = CONTROL+SHIFT+COMMAND+32
InsertComment = CONTROL+COMMAND+12
RemoveComment = CONTROL+SHIFT+COMMAND+12
AutoIndent = CONTROL+COMMAND+19
SelectAll = CONTROL+COMMAND+11
Goto = CONTROL+COMMAND+17
JumpToKeyword = CONTROL+COMMAND+21
LastViewedLine = CONTROL+COMMAND+22
ToggleThisFold = 40
ToggleFolds = CONTROL+COMMAND+40
AddMarker = CONTROL+COMMAND+38
JumpToMarker = 38
ClearMarkers = 0
Find = CONTROL+COMMAND+16
FindNext = 39
FindPrevious = SHIFT+39
FindInFiles = CONTROL+SHIFT+COMMAND+16
Replace = CONTROL+COMMAND+18
NewProject = CONTROL+SHIFT+COMMAND+24
OpenProject = CONTROL+SHIFT+COMMAND+25
CloseProject = CONTROL+SHIFT+COMMAND+33
ProjectOptions = 0
AddProjectFile = CONTROL+SHIFT+COMMAND+11
RemoveProjectFile = CONTROL+SHIFT+COMMAND+28
OpenProjectFolder = 0
NewForm = 0
FormSwitch = 0
FormDuplicate = 0
FormImageManager = 0
Compile = 41
RunExe = SHIFT+41
SyntaxCheck = 0
DebuggerCompile = 0
NoDebuggerCompile = 0
RestartCompiler = 0
CompilerOptions = 0
CreateEXE = 0
BuildAllTargets = 0
Debugger = 0
Stop = 42
Run = 43
Step = 44
StepX = CONTROL+COMMAND+44
StepOver = 46
StepOut = 47
Kill = 0
BreakPoint = 45
BreakClear = 0
DataBreakPoints = 0
ShowLog = 0
ClearLog = 0
CopyLog = 0
ClearErrorMarks = 0
DebugOutput = 0
WatchList = 0
VariableList = 0
Profiler = 0
History = 0
Memory = 0
LibraryViewer = 0
DebugAsm = 0
Purifier = 0
VisualDesigner = ALT+32
StructureViewer = ALT+29
FileViewer = 0
VariableViewer = 0
ColorPicker = 0
AsciiTable = ALT+11
Explorer = ALT+34
ProcedureBrowser = 0
Issues = 0
ProjectPanel = 0
Templates = 0
Diff = 0
AddTools = 0
Help = 37
UpdateCheck = 0
About = 0
NextOpenFile = CONTROL+COMMAND+72
PreviousOpenFile = CONTROL+SHIFT+COMMAND+72
ShiftCommentRight = CONTROL+COMMAND+15
ShiftCommentLeft = CONTROL+SHIFT+COMMAND+15
SelectBlock = CONTROL+COMMAND+23
DeselectBlock = CONTROL+SHIFT+COMMAND+23
MoveLinesUp = CONTROL+SHIFT+COMMAND+86
MoveLinesDown = CONTROL+SHIFT+COMMAND+88
DeleteLines = 0
DuplicateSelection = CONTROL+COMMAND+14
UpperCase = CONTROL+SHIFT+COMMAND+31
LowerCase = CONTROL+SHIFT+COMMAND+22
InvertCase = CONTROL+SHIFT+COMMAND+34
SelectWord = 0
ZoomIn = CONTROL+COMMAND+106
ZoomOut = CONTROL+COMMAND+107
ZoomDefault = CONTROL+COMMAND+1
AutoComplete = CONTROL+COMMAND+80
AutoCompleteConfirm = 72
AutoCompleteAbort = 79
ProceduresUpdate = 48
;
; Toolbar layout
;
[Toolbar]
ItemCount = 24
Icon_1 = Menu:New
Action_1 = Menu:New
Icon_2 = Menu:Open
Action_2 = Menu:Open
Icon_3 = Menu:Save
Action_3 = Menu:Save
Icon_4 = Separator
Action_4 =
Icon_5 = Menu:Close
Action_5 = Menu:Close
Icon_6 = Separator
Action_6 =
Icon_7 = Menu:Cut
Action_7 = Menu:Cut
Icon_8 = Menu:Copy
Action_8 = Menu:Copy
Icon_9 = Menu:Paste
Action_9 = Menu:Paste
Icon_10 = Separator
Action_10 =
Icon_11 = Menu:Undo
Action_11 = Menu:Undo
Icon_12 = Menu:Redo
Action_12 = Menu:Redo
Icon_13 = Separator
Action_13 =
Icon_14 = Menu:Compile
Action_14 = Menu:Compile
Icon_15 = Menu:CompilerOptions
Action_15 = Menu:CompilerOptions
Icon_16 = Separator
Action_16 =
Icon_17 = Menu:Debugger
Action_17 = Menu:Debugger
Icon_18 = Menu:Stop
Action_18 = Menu:Stop
Icon_19 = Menu:Run
Action_19 = Menu:Run
Icon_20 = Menu:Step
Action_20 = Menu:Step
Icon_21 = Menu:Step
Action_21 = Menu:StepOver
Icon_22 = Menu:StepOut
Action_22 = Menu:StepOut
Icon_23 = Menu:Kill
Action_23 = Menu:Kill
Icon_24 = Standard:New
Action_24 =
;
; Color settings
;
[Colors]
ASMKeywordColor = RGB(0, 217, 255)
ASMKeywordColor_Used = 1
BackgroundColor = RGB(13, 13, 13)
BackgroundColor_Used = 1
BasicKeywordColor = RGB(27, 113, 199)
BasicKeywordColor_Used = 1
CommentColor = RGB(72, 72, 72)
CommentColor_Used = 1
ConstantColor = RGB(0, 147, 3)
ConstantColor_Used = 1
LabelColor = RGB(112, 109, 7)
LabelColor_Used = 1
NormalTextColor = RGB(184, 191, 222)
NormalTextColor_Used = 1
NumberColor = RGB(0, 179, 0)
NumberColor_Used = 1
OperatorColor = RGB(62, 150, 255)
OperatorColor_Used = 1
PointerColor = RGB(224, 109, 172)
PointerColor_Used = 1
PureKeywordColor = RGB(0, 87, 174)
PureKeywordColor_Used = 1
SeparatorColor = RGB(62, 158, 255)
SeparatorColor_Used = 1
StringColor = RGB(187, 179, 9)
StringColor_Used = 1
StructureColor = RGB(255, 100, 47)
StructureColor_Used = 1
LineNumberColor = RGB(0, 60, 119)
LineNumberColor_Used = 1
LineNumberBackColor = RGB(1, 2, 3)
LineNumberBackColor_Used = 1
MarkerColor = RGB(0, 159, 40)
MarkerColor_Used = 1
CurrentLineColor = RGB(1, 2, 33)
CurrentLineColor_Used = 1
SelectionColor = RGB(0, 54, 108)
SelectionColor_Used = 1
SelectionFrontColor = RGB(173, 173, 173)
SelectionFrontColor_Used = 1
CursorColor = RGB(192, 192, 192)
CursorColor_Used = 1
Debugger_LineColor = RGB(232, 232, 255)
Debugger_LineColor_Used = 1
Debugger_LineSymbolColor = RGB(232, 232, 255)
Debugger_LineSymbolColor_Used = 1
Debugger_ErrorColor = RGB(176, 0, 0)
Debugger_ErrorColor_Used = 1
Debugger_ErrorSymbolColor = RGB(176, 0, 0)
Debugger_ErrorSymbolColor_Used = 1
Debugger_BreakPointColor = RGB(0, 159, 159)
Debugger_BreakPointColor_Used = 1
Debugger_BreakpoinSymbolColor = RGB(0, 159, 159)
Debugger_BreakpoinSymbolColor_Used = 1
DisabledBackColor = RGB(59, 59, 59)
DisabledBackColor_Used = 1
GoodBraceColor = RGB(57, 255, 9)
GoodBraceColor_Used = 1
BadBraceColor = RGB(255, 70, 70)
BadBraceColor_Used = 1
ProcedureBackColor = RGB(5, 8, 13)
ProcedureBackColor_Used = 1
CustomKeywordColor = RGB(12, 135, 117)
CustomKeywordColor_Used = 0
Debugger_WarningColor = RGB(147, 121, 0)
Debugger_WarningColor_Used = 1
Debugger_WarningSymbolColor = RGB(147, 121, 0)
Debugger_WarningSymbolColor_Used = 1
IndentColor = RGB(0, 170, 170)
IndentColor_Used = 1
ModuleColor = RGB(255, 255, 255)
ModuleColor_Used = 1
SelectionRepeatColor = RGB(176, 255, 167)
SelectionRepeatColor_Used = 1
PlainBackground = RGB(163, 163, 163)
PlainBackground_Used = 1
ToolsPanel_FrontColor = RGB(0, 149, 221)
ToolsPanel_BackColor = RGB(0, 0, 0)
;
; Folding Keywords
;
[Folding]
StartWords = 16
EndWords = 13
Start_1 = ;{
Start_2 = CompilerIf
Start_3 = DataSection
Start_4 = DeclareModule
Start_5 = Enumeration
Start_6 = Fn_
Start_7 = Import
Start_8 = Macro
Start_9 = Module
Start_10 = Procedure
Start_11 = ProcedureC
Start_12 = ProcedureCDLL
Start_13 = ProcedureDLL
Start_14 = Select
Start_15 = Structure
Start_16 = With
End_1 = ;}
End_2 = _Fn
End_3 = CompilerEndIf
End_4 = EndDataSection
End_5 = EndDeclareModule
End_6 = EndEnumeration
End_7 = EndImport
End_8 = EndMacro
End_9 = EndModule
End_10 = EndProcedure
End_11 = EndSelect
End_12 = EndStructure
End_13 = EndWith
I have a couple oddball folding words, and Ctrl+P opens preferences.
Other than that, it should just be default plus the colors.
Unifont can be downloaded here (its big, 12mb TTF with lots of unicode character support):
https://unifoundry.com/pub/unifont/unif ... 5.0.01.ttf ( Page
https://unifoundry.com/unifont/ )
SolveMyIssue_() - No QuickHelp available.