Orion9

|
Posted: Wed Dec 10, 2025 18:33 Post subject: |
|
|
Небольшая оберка к TaskDialogIndirect
 Hidden text | Code: | #{
Icon:
1 - Warning
2 - Error
3 - Information
4 - Shield
ByRef: List() of 1-3 elements
Returns: 1001-1003, 2 for cancel
#}
Func MsgBoxLinks(Icon, Header, Message, ByRef Links)
If Abs(Icon) > 4 Then Icon = 2
Icon = 65536 - Icon
If Links.Count = 0 Then Return MsgBox("Links not specified")
Local Res, Ret
Local buf = Buffer(auX64 ? 160 : 96), _
ttl = Buffer(16), _
hdr = Buffer(StrLen(Header)*2+2), _
msg = Buffer(StrLen(Message)*2+2), _
lnk = Buffer(auX64 ? 48 : 24)
ttl.SetStr("Autorun" & Chr(0))
hdr.SetStr(Header & Chr(0))
msg.SetStr(Message & Chr(0))
Local b1 = Buffer(512), b2 = Buffer(512), b3 = Buffer(512)
b1.Zero()
b2.Zero()
b3.Zero()
b1.SetStr(Links[0] & Chr(0))
If Links.Count > 1 Then b2.SetStr(Links[1] & Chr(0))
If Links.Count > 2 Then b3.SetStr(Links[2] & Chr(0))
lnk.Zero()
lnk.SetNum(0, "int", 1001, _
"ptr", b1.ptr, _
"int", 1002, _
"ptr", b2.ptr, _
"int", 1003, _
"ptr", b3.ptr)
buf.Zero()
buf.SetNum(0, "uint", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"handle", 0, _
"dword", 0x0019, _
"dword", 0x0008, _
"ptr", ttl.ptr, _
"ptr", Icon, _
"ptr", hdr.ptr, _
"ptr", msg.ptr, _
"uint", Links.Count, _
"ptr", lnk.ptr)
Res = DllCall("TaskDialogIndirect", _
"ptr", buf.ptr, _
"int*", @Ret, _
"int*", 0, _
"bool*", 0, "hresult")
Free(buf, ttl, hdr, msg, lnk, b1, b2, b3)
Return Ret
EndFunc |
На мой взгляд, нужная вещь, и точно пригодится.
Вместо кнопок стандартного далога можно использовать 1-3 командные ссылки, в этом примере ссылок две:
 Hidden text
Текст передается через объект List. Символ перевода строки auLF разделяет строку на основное и дополнительное сообщение. Реальный пример использования:
 Hidden text | Code: | Func HowToUpdate()
Static c = 0, i = 0, text, Ret
Local link = "https://www.majorgeeks.com"
Local file = TEMP & "\how_to.html", res, txt
Local backup = COMMANDER_PATH & "\Ini\Backup\how_to.html"
If Not FileExist(file) Then
Local x, y, lst = List()
lst.Add("Restore from the backup" & auLF & COMMANDER_PATH & "\Ini\Backup\how_to.html")
lst.Add("Download from the Internet" & auLF & "https://www.majorgeeks.com/content/overview/how_to.html")
#lst.Add("Default" & auLF & "Default action")
MouseGetPos("x", "y")
Ret = MsgBoxLinks(1, "File missing", "Local copy of MajorGeeks is required.", lst)
Free(lst)
If Ret = 2 Then Return
If Ret = 1001 Then
If FileExist(backup) Then
FileCopy(backup, file)
Else
MsgBox("The backup file doesn't exist" & auCRLF & backup, "Autorun", 48)
Return
EndIf
EndIf
MouseSetPos(x, y)
EndIf
If Not FileExist(file) Then
res = WinInetDownloadFile(link & "/content/overview/how_to.html", file)
If res <> 0 Then Return
Sleep(1000)
tip(file, 1, "Processing")
Sleep(500)
txt = FileRead(file)
txt = StrReplace(txt, """, '"')
txt = StrReplace(txt, "'", "'")
txt = StrReplace(txt, "&#039;", "'")
txt = StrReplace(txt, "&", "&")
txt = StrReplace(txt, ">", ">")
txt = StrReplace(txt, "<", "<")
FileWrite(file, txt)
c = 0
EndIf
Local rex
c += 1
If c = 1 Then
i = 0
text = FileRead(file)
rex = RegExp('(<a href="(.*?)">(.*?)</a>)</b><br />\R(.*?)<br />', text)
If rex.Exec() Then
Do
i += 1
Until not rex.ExecNext()
EndIf
Free(rex)
If i = 0 Then
MsgBox("File doesn't contain data " & file, "Autorun", 48)
Return
Else
tip(i & " articles prepared.", 1, "Local File")
Sleep(1000)
EndIf
EndIf
If i = 0 Then Return tip("No data or corrupt file", 3)
rex = RegExpGet(text, '(<a href="(.*?)">(.*?)</a>)</b><br />\R(.*?)<br />', _
'$4\n<a href="' & link & '/$2">Read more</a>', Random(1, i, 1))
tip(rex, 1)
EndFunc |
Кстати, тема с подсказчиком еще как зашла. Люблю, когда в фоне что-то всплывает, сообщает и информирует ) |
|