Страница 15 из 130

Добавлено: Чт сен 09, 2010 11:24
MVV
mifa писал(а):У меня этот файл называется Autorun.sample.wdx нужно ли его перименовывать?
Если я правильно понимаю, файл конфигурации должен иметь такое же имя, как и autorun-плагин, т.е. при плагине Autorun.sample.wdx файл конфигурации должен называться Autorun.sample.cfg. Но лучше, конечно, переименовать плагин обратно в Autorun.wdx и файл конфигурации назвать просто Autorun.cfg.

Далее, не лишним было бы убедиться, что плагин загружен и работает правильно. Например, делаем кнопку с командой TCFS2.exe /ei mm2. Если тотал ругается, что команда не определена, значит, плагин Autorun или же модуль Autorun_HideMenu не загружены. А если не ругается, такая команда должна переключать (включать или выключать) строку главного меню тотала.

А чтобы назначить команде переключения меню клавишу, достаточно оформить её как em-команду в секции usercmd.ini браузера команд (cm_CommandBrowser) и этой команде клавишу. Но обращаю внимание, что если при скрытом меню нажать Alt, меню будет временно показано, поэтому дополнительную клавишу назначать в общем-то и необязательно - можно просто прописать в Autorun.cfg после загрузки модуля Autorun_HideMenu команду TCFS2.exe /ei mm0 (разумеется, указать полный путь к TCFS2.exe).



TCFS2 1.4.1 (изменения после 1.4.0.4): 8)
* действия в команде не срабатывало, если его имя заканчивалось символом табуляции
* зависание при использовании параметра /d=msec
* сбой при вызове функции msg
* исправления в файле конфигурации

TCFS2 1.4.1 на wincmd.ru

Спасибо Flasher'у за проявленную дотошность при тестировании. :)

Добавлено: Пн сен 13, 2010 12:34
MVV
Ответ на личное сообщение разросся до такой степени, что я решил, что это может пригодиться кому-либо ещё.

В последней версии TCFS2 есть пример команды switch_sp, которая позволяет переключать два режима окна - распахнутое на почти весь экран и некоторое среднее по центру экрана:

Код: Выделить всё

switch_sp=move(# ? 0 : @*7/64, # ? 0 : @*7/64, @-# ? @ : @*25/32, @-1-# ? @-1 : @*25/32), , switch_sp
Так можно задать любое число позиций и переключаться между ними, но есть одна проблема. Все 4 параметра (положение окна и размеры) вычисляются независимо от других, поэтому, если перемещать или изменять размер окна между вызовами такой команды, возможна рассинхронизация. Например, если выполнить switch_sp, чтобы окно распахнулось, а потом уменьшить его мышью за правый нижний угол (не меняя позиции окна), то последюущие вызовы switch_sp будут работать неверно (переключать будут между маленьким окном в углу и большим в правой нижней части экрана). А возникает потому, что в описанном случае позиционирование срабатывает по схеме из точки (0, 0), а изменение размера - по схеме из маленького в большое (нельзя при изменении одной величины учитывать другую). Сдвиг окна в любую сторону на 1 пиксель решает проблему (а лучше - с изменением размера, т.е. слегка изменить размер окна с левого верхнего угла).

Среди решений, избавленных от такого недостатка, есть вариант с использованием некоторого неиспользуемого системой бита стиля окна. Посмотрим, есть ли такие.

В файле WinUser.h определены следующие числовые значения стилей (файл из Visual Studio 2010, так что самый свежий):
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
#define WS_CHILD 0x40000000L
#define WS_MINIMIZE 0x20000000L
#define WS_VISIBLE 0x10000000L
#define WS_DISABLED 0x08000000L
#define WS_CLIPSIBLINGS 0x04000000L
#define WS_CLIPCHILDREN 0x02000000L
#define WS_MAXIMIZE 0x01000000L
#define WS_CAPTION 0x00C00000L
#define WS_BORDER 0x00800000L
#define WS_DLGFRAME 0x00400000L
#define WS_VSCROLL 0x00200000L
#define WS_HSCROLL 0x00100000L
#define WS_SYSMENU 0x00080000L
#define WS_THICKFRAME 0x00040000L
#define WS_GROUP 0x00020000L
#define WS_TABSTOP 0x00010000L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L
#define WS_ACTIVECAPTION 0x0001

#define WS_EX_DLGMODALFRAME 0x00000001L
#define WS_EX_NOPARENTNOTIFY 0x00000004L
#define WS_EX_TOPMOST 0x00000008L
#define WS_EX_ACCEPTFILES 0x00000010L
#define WS_EX_TRANSPARENT 0x00000020L
#define WS_EX_MDICHILD 0x00000040L
#define WS_EX_TOOLWINDOW 0x00000080L
#define WS_EX_WINDOWEDGE 0x00000100L
#define WS_EX_CLIENTEDGE 0x00000200L
#define WS_EX_CONTEXTHELP 0x00000400L
#define WS_EX_RIGHT 0x00001000L
#define WS_EX_LEFT 0x00000000L
#define WS_EX_RTLREADING 0x00002000L
#define WS_EX_LTRREADING 0x00000000L
#define WS_EX_LEFTSCROLLBAR 0x00004000L
#define WS_EX_RIGHTSCROLLBAR 0x00000000L
#define WS_EX_CONTROLPARENT 0x00010000L
#define WS_EX_STATICEDGE 0x00020000L
#define WS_EX_APPWINDOW 0x00040000L
#define WS_EX_LAYERED 0x00080000
#define WS_EX_NOINHERITLAYOUT 0x00100000L
#define WS_EX_LAYOUTRTL 0x00400000L
#define WS_EX_COMPOSITED 0x02000000L
#define WS_EX_NOACTIVATE 0x08000000L
Оставляем только числа, сортируем, удаляем дубликаты... Regex рулит. :)
Вот таблица занятости битов основных стилей (HEX):
00000001 USED
00000002
00000004
00000008
00000010
00000020
00000040
00000080
00000100
00000200
00000400
00000800
00001000
00002000
00004000
00008000
00010000 USED
00020000 USED
00040000 USED
00080000 USED
00100000 USED
00200000 USED
00400000 USED
00800000 USED
01000000 USED
02000000 USED
04000000 USED
08000000 USED
10000000 USED
20000000 USED
40000000 USED
80000000 USED
А вот - расширенных (тоже HEX):
00000001 USED
00000002
00000004 USED
00000008 USED
00000010 USED
00000020 USED
00000040 USED
00000080 USED
00000100 USED
00000200 USED
00000400 USED
00000800
00001000 USED
00002000 USED
00004000 USED
00008000
00010000 USED
00020000 USED
00040000 USED
00080000 USED
00100000 USED
00200000
00400000 USED
00800000
01000000
02000000 USED
04000000
08000000 USED
10000000
20000000
40000000
80000000
Как видим, есть пока неиспользуемые биты, которые можно попробовать использовать в своих целях. :) Надеюсь, система не использует их для своих целей - стоит проверить, изменится ли что-нибудь при их установке. Суммируем (удаляем строки с USED, заменяем \r\n на +, копируем и вставляем строку по Ctrl+V в виндосовский калькулятор в режиме HEX, жмем Enter), для обычных стилей получаем число FFFE, для расширенных - число F5A08802. А теперь пишем команду set_style(# | $FFFE, # | F5A08802), отходим от компа на безопасное расстояние и запускаем... :arrow: Не работает... :? Почему? Забыли символ доллара перед числом F5A08802. :lol: Повторяем эксперимент... :!: Обычные стили установились, расширенные - нет... При отладке в тестовой программке на Windows 7 x64 выяснилось, что изменять система позволяет лишь биты расширенного стиля, содержащиеся в маске 0A5F76F7 (видимо, фильтрует неподдерживаемые - странно, что только расширенные фильтрует) - остальные биты при их установке или снятии не изменяли значения при повторном чтении. Таким образом, имеем F5A08802 & 0A5F76F7 = 2... То есть, система позволяет изменять лишь один бит из тех, которые не указаны в файле WinUser.h, да и тот может иметь какое-то значение (возможно, Windows XP будет добрее в этом плане :)). Что ж, с расширенными стилями фокус не прошел, но у нас полно неиспользуемых битов основных стилей (аж 15 штук, хватит на любое извращение). 8)

Чтобы поставить, скажем, бит 00008000 основного стиля, нужно вызвать set_style(# | $00008000), чтобы снять - вызвать set_style(# & ~$00008000), а чтобы проверить, установлен ли он - вызвать style(# & $00008000). С остальными битами - аналогично. Таким образом, составляем узкоспециализированную команду:

Код: Выделить всё

s00008000_switch_sp=set_style(# & ~$00008000) move(@*7/64, @*7/64, @*25/32, @*25/32), style(# & $00008000), s00008000_switch_sp | set_style(# | $00008000) move(0, 0, @, @-33), , s00008000_switch_sp
Работает! :)
Команда проверяет наличие бита стиля 00008000, если бит стоит, снимает его и позиционирует окно в середину экрана, в противном случае команда ставит бит и распахивает окно. В обоих случаях команда дописывает сама себя к строке отката.

Почему узкоспециализированную? Потому, что только эта команда должна использовать этот бит (и бит не должен использоваться системой).
Название команды я специально начал с приставки s00008000_ - если использовать несколько команд, работающих с неиспользуемыми битами стилей, так можно легко визуально определить, какие стили уже используются (особенно если располагать такие команды подряд и в алфавитном порядке), и что команда вообще использует особый приём.

Добавлено: Пн сен 13, 2010 21:06
Flasher
MVV
Мощно! :D Распечатаю и приклею себе этот ликбез на стену. :D

Поскольку Visual Studio 2010 и файла WinUser.h у меня нет, то экспериментировать не с чем. А результаты суммирования неюзанных битов у меня почему-то в HEX-режиме не совпали с твоими. Что-то я не так делаю, по всей видимости.
MVV писал(а):отходим от компа на безопасное расстояние и запускаем.
Я так и сделал, думал блок питания взорвётся, или кондёры на материнке отстрелят мне, что не надо. :lol:
MVV писал(а):При отладке в тестовой программке на Windows 7 x64 выяснилось, что изменять система позволяет лишь биты расширенного стиля. ... Что ж, с расширенными стилями фокус не прошел, но у нас полно неиспользуемых битов основных стилей (аж 15 штук, хватит на любое извращение).
Не понял как это сопоставить. Т.е. в семёрке x64 работать не будет что ли?
MVV писал(а):В обоих случаях команда дописывает сама себя к строке отката.
Что, собственно, и требовалось, и без всяких ifcond. :)
MVV писал(а):Почему узкоспециализированную? Потому, что только эта команда должна использовать этот бит (и бит не должен использоваться системой).
Но при этом, если правильно понял, я могу заменить его на любой из оставшихся 14-ти?

Добавлено: Пн сен 13, 2010 21:58
MVV
Поскольку Visual Studio 2010 и файла WinUser.h у меня нет, то экспериментировать не с чем.
Я знаю, что у тебя нет Visual Studio 2010, и не предлагаю экспериментировать, просто указал источник информации. :wink:
А результаты суммирования неюзанных битов у меня почему-то в HEX-режиме не совпали с твоими. Что-то я не так делаю, по всей видимости.
Калькулятор, инженерный вид, HEX, в буфере строка
00000002+00000004+00000008+00000010+00000020+00000040+00000080+00000100+00000200+00000400+00000800+00001000+00002000+00004000+00008000, жму Ctrl+V, Enter - получаю FFFE. Далее, то же самое со строкой 00000002+00000800+00008000+00200000+00800000+01000000+04000000+10000000+20000000+40000000+80000000 - получаю F5A08802.
Не понял как это сопоставить. Т.е. в семёрке x64 работать не будет что ли?
Мысль была о том, что Windows 7 x64 (возможно, в предыдущих версиях Windows такого ограничения не было) не разрешает устанавливать неиспользуемые биты расширенного стиля. Но при этом позволяет устанавливать любые биты обычного стиля (и неиспользуемых битов обычного стиля порядка 15 штук).
Что, собственно, и требовалось, и без всяких ifcond.
Ну... оно-то работает, но не без оговорки про неиспользуемость изменяемого бита другими приложениями. И откат тут собственно не очень-то и нужен (сделан исключительно ради галочки), команда сама по себе является переключателем. Функция отката в первую очередь предназначена для возможности отката команд, повторный запуск которых не возвращает всё как было.
Но при этом, если правильно понял, я могу заменить его на любой из оставшихся 14-ти?
Да, именно.

Добавлено: Пн сен 13, 2010 22:17
Flasher
MVV писал(а):Калькулятор, инженерный вид, HEX, в буфере строка
Аа, я стормозил, перевод строки не убрал. Сейчас всё в порядке.
MVV писал(а):Мысль была о том, что Windows 7 x64 не разрешает устанавливать неиспользуемые биты расширенного стиля.
Так я почему обе фразы скопировал? Тут ты пишешь "позволяет". >>
Flasher писал(а):на Windows 7 x64 выяснилось, что изменять система позволяет лишь биты расширенного стиля.
MVV писал(а):Ну... оно-то работает, но не без оговорки про неиспользуемость изменяемого бита другими приложениями.
Понял. А библиотеки, службы и сервисы, загруженные по умолчанию, могут стать препятствием? Или это касается только вручную вызываемых приложений?
MVV писал(а):Да, именно.
Буду иметь в виду.

Добавлено: Пн сен 13, 2010 22:30
MVV
Flasher писал(а):
MVV писал(а):Мысль была о том, что Windows 7 x64 не разрешает устанавливать неиспользуемые биты расширенного стиля.
Так я почему обе фразы скопировал? Тут ты пишешь "позволяет". >>
Flasher писал(а):на Windows 7 x64 выяснилось, что изменять система позволяет лишь биты расширенного стиля.
Что-то ты не так процитировал. И точку поставил там, где нее не было. Полная фраза была такая:
При отладке в тестовой программке на Windows 7 x64 выяснилось, что изменять система позволяет лишь биты расширенного стиля, содержащиеся в маске 0A5F76F7...
То есть, те биты, которые система использует, она изменять позволяет, а остальные - нет (и биты масок 0A5F76F7 и F5A08802 практически не пересекаются - за исключением бита 00000002, который скорее всего используется в системе, раз его можно изменять).
Flasher писал(а):
MVV писал(а):Ну... оно-то работает, но не без оговорки про неиспользуемость изменяемого бита другими приложениями.
Понял. А библиотеки, службы и сервисы, загруженные по умолчанию, могут стать препятствием? Или это касается только вручную вызываемых приложений?
Это касается любого программного кода, который для каких бы то ни было целей может изменять значения стилей окна тотала. В том числе системного кода, кода служб, приложений и т.д. и т.п. Но система по идее не должна использовать стили, которые недоступны или недокументированы в Windows API. Остаются приложения, такие как TCFS2. :D

Добавлено: Пн сен 13, 2010 22:47
Flasher
MVV писал(а):Что-то ты не так процитировал. И точку поставил там, где нее не было.
Да, прошу прощения, вырвал из контекста, где учитывалась конкретная маска.
MVV писал(а):То есть, те биты, которые система использует, она изменять позволяет, а остальные - нет (и биты масок 0A5F76F7 и F5A08802 практически не пересекаются - за исключением бита 00000002, который скорее всего используется в системе, раз его можно изменять).
Вот, сейчас поразжёванней. Ну раз биты из основных стилей задействовать можно в любой винде, то на этом можно остановиться. :)
MVV писал(а):Но система по идее не должна использовать стили, которые недоступны или недокументированы в Windows API. Остаются приложения, такие как TCFS2.
Хорошо, что ты дописал эту фразу, а то я было начал спрашивать про степень вероятности появления на горизонте кода с такими битами. :wink:

Добавлено: Вс окт 24, 2010 02:49
MVV
TCFS2 1.4.2 (новое после 1.4.1): 8)
+ функция set_separator
+ теперь функции можно вызывать прямо из командной строки после параметра /ef


TCFS2 1.4.1 на wincmd.ru


Функция set_separator имеет два режима. Основной - когда она ставит сепаратор в заданную позицию. И неполный - когда она лишь инициирует перемещение сепаратора, при этом при движении мыши сепаратор будет следовать за ней, и щелчком можно будет подтвердить выбор (правда, отказаться от перемещения возможности уже нет).

Код: Выделить всё

TCFS2 /ef "set_separator(50)"
TCFS2 /ef "set_separator(#+20)"
TCFS2 /ef "set_separator(-1)"

Добавлено: Вс окт 24, 2010 05:47
Flasher
Оперативненько. 8) Спасибо! Жду дальнейших новоделок (если получится, конечно). :wink:

Добавлено: Ср окт 27, 2010 10:05
sa
MVV писал(а):+ функция set_separator
Нет ли возможности в основном режиме сохранять положение курсора мышки после выполнения функции?
MVV писал(а):+ теперь функции можно вызывать прямо из командной строки после параметра /ef
Удобно: иногда лень забираться в ini-файл для добавления новых команд.

Добавлено: Ср окт 27, 2010 12:03
MVV
sa писал(а):Нет ли возможности в основном режиме сохранять положение курсора мышки после выполнения функции?
Есть.
sa писал(а):Удобно: иногда лень забираться в ini-файл для добавления новых команд.
Для того и сделано. :D Ну и не только, конечно. Так удобнее вызывать TCFS2 из каких-нибудь скриптов со специально сформированной командной строкой.

А проблему остающейся всплывающей подсказки частично удалось решить, но при этом теряется наглядность - панель не передвигается за мышью в реалтайме, но окно тотала ждет клика, и при клике перемещает в ту позицию сепаратор. Сижу и думаю, оставить как есть, или сделать так. Ага, при зажатии левой кнопки мыши панель начинает двигаться за мышью, и даже проценты отображаются, и никаких глюков.

Оба исправления представлены в пробной версии, выложенной здесь. Пробуйте. :)


Flasher, касаемо твоей просьбы ресайзить активную панель - простого способа узнать активное окно другого процесса тупо нет, а без этого понять, какая панель у тебя активна, невозможно.

Добавлено: Ср окт 27, 2010 15:44
sa
MVV писал(а):Оба исправления представлены в пробной версии, выложенной здесь. Пробуйте.
С сохранением положения курсора мышки теперь всё отлично.
По-поводу инициирования перемещения сепаратора: мне начальный вариант больше нравится. Новый отчасти похож на родной тоталовский, если просто хвататься за разделитель левой клавишей мыши.
PS Случайно обнаружил, что TCScript.Helper каким-то образом убирает остающуюся всплывающую подсказку(и). Достаточно вызвать любой скрипт с ним (даже пустой).

Добавлено: Ср окт 27, 2010 17:08
MVV
Новый отчасти похож на родной тоталовский, если просто хвататься за разделитель левой клавишей мыши.
В чем-то похож, но не нужно целиться на сепаратор при этом, можно тыкать в любом месте. Зато меньше глючит.
Случайно обнаружил, что TCScript.Helper каким-то образом убирает остающуюся всплывающую подсказку(и). Достаточно вызвать любой скрипт с ним (даже пустой).
Видимо, он чего-то делает не такого:) чего - понятия не имею, никогда в глаза его не видел, а его исходных кодов - тем более.

Добавлено: Ср окт 27, 2010 17:17
Flasher
MVV писал(а):А проблему остающейся всплывающей подсказки частично удалось решить, но при этом теряется наглядность - панель не передвигается за мышью в реалтайме, но окно тотала ждет клика, и при клике перемещает в ту позицию сепаратор. Сижу и думаю, оставить как есть, или сделать так. Ага, при зажатии левой кнопки мыши панель начинает двигаться за мышью, и даже проценты отображаются, и никаких глюков.
Ну да, только вот проценты хотелось бы видеть без удерживания ЛКМ, а то как-то странно получается. И полоску после выполнения команды не видно. Кстати, при клике ПКМ теперь можно получать доступ к стандартному ТС-шному конт. меню с выбором нужной пропорции, т.е. тянуть курсор к середине не требуется. Даже не пойму пока какой вариант лучше..

MVV писал(а):Flasher, касаемо твоей просьбы ресайзить активную панель - простого способа узнать активное окно другого процесса тупо нет, а без этого понять, какая панель у тебя активна, невозможно
Ту бэд, костыль не удался.. :( Ну ок, попытка - не пытка.

А ты мог бы сделать такое "чудо": sp_fixmove(x), команду которая приклеивала бы сепаратор к заданному разграничителю. Например, x=10, полоска остаётся на месте положения курсора до тех пор, пока курсор не перейдёт за середину заданной области | " | " | " |, в данном случае за 5% от первого фантомного разграничителя, после этого приклеится к следующему. Это сведёт постановку положения к чётким пропорциям при мувинге, как в случае с приклеиваниями окон некоторых приложений к тем или иным элементам интерфейса.

К пользователям Win7: проверьте на своих машинах команды sp_inc и sp_dec. К сожалению на моей вместо перемещения сепаратора происходит уменьшение окна вдвое по ширине, фактически имитация сдвига правого/левого края до середины. На XP проблем нет.
Просьба отписаться здесь.

Добавлено: Ср окт 27, 2010 17:23
Flasher
MVV писал(а):никогда в глаза его не видел, а его исходных кодов - тем более.
Обратись в личку к Volniy, пусть поделится секретом. :wink: