Orion9

|
Posted: Sun Jan 12, 2025 13:50 Post subject: |
|
|
AkulaBig
Ты глянь, и правда можно Но только если это wcmicons.dll или путь к ico-файлу, а я уж губу раскатал на что-то большее...) Но хоть так, и то уже лучше.
Но говоря о куче однотипных команд, я имел в виду другое. Самый большой недостаток вызова зарегистрированной комады по коду - в неё нельзя передать параметр, если вызов происходит из кнопки или пункта меню. Единственный способ передать параметр в таком случае - использовать внешний вызов с посылкой сообщения через PostMessage с указанием кода команды и одного числового параметра. Например, регистрируем команду с кодом 70300 и привязываем к нему функцию UwdxBar:
Code: | RegisterCommand 70300 "UwdxBar"
Func UwdxBar(lParam)
ShowHint(lParam)
EndFunc |
Теперь, чтобы вызвать эту функцию из кнопки или пункта меню, достаточно просто указать код 70300:
Code: |
TOTALCMD#BAR#DATA
70300
%COMMANDER_EXE%
Функция Autorun "UwdxBar"
1
-1
|
Но передать в нее параметр (lParam) таким образом не получится. Здесь нужен либо внешний вызов (например TCFS2.exe /ef "msg(1075, 70300, 55, 1)", где 55 - передаваемый параметр), либо регистрация номера команды в TOTALCMD.INC и присвоение ему имени, т.е. Code: | [________Autorun_________]=0
cm_UwdxBar=70300;Uwdx Bar Menu |
Тогда параметр можно передать кнопке:
Code: | TOTALCMD#BAR#DATA
cm_UwdxBar
55
%COMMANDER_EXE%
Функция Autorun "UwdxBar" (55)
1
-1
|
А теперь допустим мне нужно создать панель или (что еще хуже) меню из 55 пунктов. Как в таком случае передать параметр каждому пункту меню? Есть три варианта: (1) зарегистрировать заранее все номера с параметром, как я это делал раньше, например:
Code: | RegisterCommand 70110 "WdxMenuItem" 0
RegisterCommand 70111 "WdxMenuItem" 1
RegisterCommand 70112 "WdxMenuItem" 2
RegisterCommand 70113 "WdxMenuItem" 3
RegisterCommand 70114 "WdxMenuItem" 4
RegisterCommand 70115 "WdxMenuItem" 5
...
RegisterCommand 70165 "WdxMenuItem" 55
|
Каждой кнопке будет сопоставлен свой уникальный код. (Именно об этой куче команд я и говорил).
Второй вариант - посылка параметра через сообщение, т.е. в созданной панели у каждой кнопки будет вариация: TCFS2.exe /ef "msg(1075, 70300, 0, 1) - TCFS2.exe /ef "msg(1075, 70300, 55, 1).
И третий способ (который я и попробовал вчера) - прописка cm_ команды в TOTALCMD.INC - тогда у каждой кнопки будет вариация: cm_UwdxBar 1 - cm_UwdxBar 55. Как видите, у каждого способа есть свои плюсы и минусы.
P.S. Обнаружил, что в ТС х64 переключение ассоциаций с вызовом окна и прожатием кнопки не работает. Оказывается в 64-версии имя класса кнопок и номера их экземпляров отличаются, пришлось это учесть исправлением строки поиска кнопки на:
Code: | b = WinFind(h, (AUTORUN_TCARCH = 32 ? "TButton" : "Button"), (AUTORUN_TCARCH = 32 ? 3 : 2)) |
Сама функция при этом не изменилась:
 Hidden text Code: | Func AssocWinSynс()
Local h = 0, i
PostMessage(AUTORUN_TCHANDLE, 0x433, 519)
# ожидание появления окна
For i = 1 To 75
h = WinFind(0, "TDlgCustomColors")
If h > 0 Then Break
Sleep(25)
#OutputDebugString(h)
Next
If h > 0 Then
b = WinFind(h, (AUTORUN_TCARCH = 32 ? "TButton" : "Button"), (AUTORUN_TCARCH = 32 ? 3 : 2))
SendMessage(b, 0xF5, 0, 0)
Else
ShowHint("Окно не найдено")
Return
Endif
AssocUpdateWin(false)
EndFunc
|
|
|