Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Autorun 
Author Message
Orion9



PostPosted: Sun Jan 12, 2025 13:50    Post subject: Reply with quote

AkulaBig
Ты глянь, и правда можно Smile Но только если это 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
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group