Тема: VBScript:DynamicWrapperX, Shell_NotifyIcon и русский язык
Написал небольшой скрипт для установки иконки в трей и вывола уведомления.
Работает, но при выволе уведомления или хинта на русском - кпакозябры. Вот фрагмент кода:
Public Const IMAGE_ICON = 1
Public Const NIIF_NONE = &H0
Public Const NIIF_WARNING = &H2
Public Const NIIF_ERROR = &H3
Public Const NIIF_INFO = &H1
Public Const NIIF_GUID = &H4
Public Const NIF_TIP = 4
Public Const NIF_MESSAGE = 1
Public Const NIF_STATE = &H8
Public Const NIF_INFO = &H10
Public Const NIM_ADD = 0
Public Const NIM_DELETE = 2
Public Const NIM_MODIFY = 1
Public Const NIF_ICON = 2
Public Const VK_ESCAPE = &H1B
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_SHELLNOTIFY = &H405
Public Const NID_SIZE = 488
Public DX
Public TrayIcon
Set DX = CreateObject("DynamicWrapperX")
DX.Register "SHELL32", "Shell_NotifyIcon", "i=ll", "r=l"
DX.Register "KERNEL32","LoadLibraryA","i=s","r=l"
DX.Register "USER32","LoadImageA","i=llllll","r=l"
DX.Register "KERNEL32","FreeLibrary","i=l"
DX.Register "KERNEL32","RtlMoveMemory","i=lll","r=l"
DX.Register "KERNEL32","HeapAlloc","i=lll","r=l"
DX.Register "KERNEL32","GetProcessHeap","r=l"
DX.Register "KERNEL32","HeapFree","i=lll","r=l"
Class NOTIFYICONDATA
Private hHeap,init
Private Sub Class_Initialize
hHeap = DX.GetProcessHeap()
init = DX.HeapAlloc(hHeap,0,NID_SIZE)
End Sub
Private Sub Class_Terminate
DX.HeapFree hHeap,0,init
End Sub
Public Property Get BaseAddr
BaseAddr = init
End Property
Public Property Get Size
Size = NID_SIZE
End Property
Private Function ConvertData(dwData)
hW = Fix(dwData/65536)
lW = dwData mod 65536
ConvertData = ChrW(lW) & ChrW(hW)
End Function
Public Sub SetData(strName,varData)
Dim iOfs, iSize, sData
Select Case strName
Case "cbSize"
iOfs = 0: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "hWnd"
iOfs = 4: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "uID"
iOfs = 8: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "uFlags"
iOfs = 12: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "uCallbackMessage"
iOfs = 16: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "hIcon"
iOfs = 20: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "szTip"
sData = Left(varData,127) & vbNullchar
iOfs = 24: iSize = 128
For i = 1 To iSize
DX.RtlMovememory init + iOfs - 1 + i, DX.StrPtr(Mid(sData,i,1)), 1
Next
Case "dwState"
iOfs = 152: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "dwStateMask"
iOfs = 156: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "szInfo"
sData = Left(varData,255) & vbNullchar
iOfs = 160: iSize = 256
For i = 1 To iSize
DX.RtlMovememory init + iOfs - 1 + i, DX.StrPtr(Mid(sData,i,1)), 1
Next
Case "uTimeout"
iOfs = 416: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
Case "szInfoTitle"
sData = Left(varData,63) & vbNullchar
iOfs = 420: iSize = 64
For i = 1 To iSize
DX.RtlMovememory init + iOfs - 1 + i, DX.StrPtr(Mid(sData,i,1)), 1
Next
Case "dwInfoFlags"
iOfs = 484: iSize = 4
sData = ConvertData(varData)
DX.RtlMovememory init + iOfs, DX.StrPtr(sData), iSize
End Select
End Sub
End Class
Class NotifyIcon
Private SysTray
Private SysTrayActivated
Private Sub Class_Initialize
Set SysTray = New NOTIFYICONDATA
End Sub
Private Sub Class_Terminate
Delete
Set SysTray = Nothing
End Sub
Public Function Init(hWnd,ToolTip,hIcon)
If SysTrayActivated Then
Exit Function
End If
With SysTray
.SetData "cbSize", .Size
.SetData "hWnd", hWnd
.SetData "uID", vbNull
.SetData "uFlags", NIF_ICON Or NIF_TIP
.SetData "uCallbackMessage", WM_MOUSEMOVE
.SetData "hIcon", hIcon
.SetData "szTip", ToolTip
.SetData "dwState", 0
.SetData "dwStateMask", 0
End With
DX.Shell_NotifyIcon NIM_ADD,SysTray.BaseAddr
SysTrayActivated = True
Init = SysTray.baseAddr
End Function
Public Sub Delete()
If Not SysTrayActivated Then
Exit Sub
End If
DX.Shell_NotifyIcon NIM_DELETE,SysTray.BaseAddr
Set SysTray = Nothing
SysTrayActivated = False
End Sub
Public Sub Modify(Text, Title, Icon, Timeout)
If Not SysTrayActivated Then
Exit Sub
End If
With SysTray
.SetData "uFlags", NIF_ICON Or NIF_INFO Or NIF_MESSAGE Or NIF_TIP
.SetData "szInfo", Text
.SetData "szInfoTitle", Title
.SetData "dwInfoFlags", Icon
.SetData "uTimeout", Timeout
End With
DX.Shell_NotifyIcon NIM_MODIFY,SysTray.BaseAddr
End Sub
End ClassПодскажите кто-нибудь, как заставить скрипт работать на русском?

