Есть ли существует способ изменить значок папки Windows с помощью сценария Perl?

РЕДАКТИРОВАТЬ 1: Мой оригинальный ответ ниже был «не делай этого». В интересах быть позитивным:

Реальный вопрос, я думаю, не имеет ничего общего с iPad X против iPad mini. Я думаю, что речь идет об оптимизации размеров и размещения элементов пользовательского интерфейса с учетом эргономики пользователя. Вам необходимо определить размер пальца (ов) пользователя, чтобы определить размер элемента пользовательского интерфейса и, возможно, позиционирование. Это, опять же, вероятно, и должно быть достигнуто без необходимости знать, на каком устройстве вы работаете. Давайте преувеличиваем: ваше приложение работает с диагональю экрана 40 дюймов. Не знаю марку и модель или DPI. Как вы масштабируете элементы управления?

Вам нужно отобразить кнопку, которая является элементом гейтинга на сайте / в игре. Я оставлю на ваше усмотрение решение, где и как имеет смысл это делать.

Хотя пользователь будет видеть это как одну кнопку, в действительности он будет состоять из матрицы маленьких плотно упакованных кнопок, которые визуально покрыты, чтобы выглядеть как изображение одной кнопки. Представьте себе кнопку размером 100 x 100 пикселей, состоящую из 400 кнопок, каждая 5 x 5 пикселей. Вам нужно поэкспериментировать, чтобы понять, что здесь имеет смысл и насколько мала ваша выборка.

Возможный CSS для массива кнопок:

.sense_row {
  width:100px;
  height:5px;
  margin:0;
  padding:0;
}

.sense_button {
  float:left;
  width:3px;
  height:3px;
  padding:0px;
  margin:0px;
  background-color:#FF0;
  border:1px solid #000;
} 

И результирующий массив:

button array

Когда пользователь коснется массива кнопок, вы будете эффективно получить изображение области контакта пальца пользователя. Затем вы можете использовать любые критерии, которые вы хотите (возможно, эмпирически выведенные), чтобы получить набор чисел, которые вы можете использовать для масштабирования и позиционирования различных элементов пользовательского интерфейса в соответствии с вашими требованиями.

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

Я бы предположил, что эта кнопка sense_array может быть скрыта как часть процесса ввода в приложение. Например, если это игра, может быть, есть кнопка «Играть» или различные кнопки с именами пользователей или средство для выбора уровня, на котором они будут играть, и т. Д. Вы поняли идею. Кнопка sense_array может жить в любом месте, к которому пользователь должен прикоснуться, чтобы войти в игру.

РЕДАКТИРОВАТЬ 2: Просто отметьте, что вам, вероятно, не нужно так много сенсорных кнопок. Набор концентрических кругов или кнопок, расположенных как огромная звездочка *, вполне подойдет. Вы должны экспериментировать.

С моим старым ответом ниже я даю вам обе стороны медали.

СТАРЫЙ ОТВЕТ:

Правильный ответ: не делай этого. Это плохая идея.

Если ваши кнопки настолько малы, что они становятся непригодными для использования на мини, вам нужно увеличить размер кнопок.

Если я и научился чему-нибудь в работе с нативными приложениями для iOS, так это тому, что попытка перехитрить Apple - это формула чрезмерной боли и обострения. Если они решили не позволять вам идентифицировать устройство, это потому, что в их песочнице вы не должны.

Интересно, вы настраиваете размер / расположение в портретной или альбомной ориентации?

6
задан brian d foy 24 June 2009 в 18:03
поделиться

2 ответа

Вы точно можете сделать это с помощью Perl. Windows управляет значками каталогов с помощью скрытого системного файла Dekstop.ini в каждой папке. Содержимое выглядит примерно так:

 [.ShellClassInfo]
 IconFile=%SystemRoot%\system32\SHELL32.dll
 IconIndex=41

В Windows XP (и я предполагаю, что в других системах) значок 41 представляет собой дерево. Windows требует, чтобы этот файл был явно задан как системный файл, чтобы он работал, это означает, что нам нужно копаться в Win32API :: File , чтобы создать его:

 #!/usr/bin/perl
 use strict;
 use warnings;

 use Win32API::File qw(createFile WriteFile fileLastError CloseHandle);

 my $file = createFile(
      'Desktop.ini',
      {
           Access     => 'w',        # Write access
           Attributes => 'hs',       # Hidden system file
           Create     => 'tc',       # Truncate/create
      }
 ) or die "Can't create Desktop.ini - " . fileLastError();

 WriteFile(
      $file,
      "[.ShellClassInfo]\r\n" .
      "IconFile=%SystemRoot%\\system32\\SHELL32.dll\r\n" .
      "IconIndex=41\r\n",
      0, [], []
 ) or die "Can't write Desktop.ini - " . fileLastError();

 CloseHandle($file) or die "Can't close Desktop.ini - " . fileLastError();

Если вы запустите приведенный выше код, он должен установить значок для текущего каталога в виде дерева. Возможно, вам потребуется обновить список каталогов, прежде чем проводник обнаружит изменение.

Теперь, когда у нас есть способ изменить значки, теперь мы можем просто пройтись по всему диску и изменить каждую папку, соответствующую нашему шаблону. Мы можем сделать это довольно легко с помощью File :: Find , или одна из его альтернатив (например, File :: Find :: Rule или File :: Next ):

 #!/usr/bin/perl
 use strict;
 use warnings;
 use File::Find qw(find);
 use Win32API::File qw(createFile WriteFile fileLastError CloseHandle);

 my $topdir = $ARGV[0] or die "Usage: $0 path\n";

 find( \&changeIcon, $topdir);

 sub changeIcon {
     return if not /documents$/i;   # Skip non-documents folders
     return if not -d;              # Skip non-directories.

     my $file = createFile(
         "$_\\Desktop.ini",
         {
              Access     => 'w',        # Write access
              Attributes => 'hs',       # Hidden system file
              Create     => 'tc',       # Truncate/create
         }
     ) or die "Can't create Desktop.ini - " . fileLastError();

     WriteFile(
         $file,
         "[.ShellClassInfo]\r\n" .
         "IconFile=%SystemRoot%\\system32\\SHELL32.dll\r\n" .
         "IconIndex=41\r\n",
         0, [], []
     ) or die "Can't write Desktop.ini - " . fileLastError();

     CloseHandle($file) or die "Can't close Desktop.ini - " . fileLastError();
 }

К сожалению, я только что обнаружил, что значок изменяется только , если в каталоге в настоящее время или когда-то был значок ... В самом каталоге явно установлен атрибут, который заставляет Windows искать файл Desktop.ini , но я не могу понять, что это такое. Таким образом, вышеуказанное решение является неполным; нам также необходимо найти и исправить атрибуты в каталоге, в который мы добавляем значок.

Paul

8
ответ дан 10 December 2019 в 00:43
поделиться

Чтобы обновить значок, вам нужно будет вызвать вуду SHChangeNotify (пример C ++, но вы поняли идею):

int imageIndex = Shell_GetCachedImageIndexW(wPath, GetSyncFolderIconIndex(), 0);
if (imageIndex != -1)
{
    // If we don't do this, and we EVER change our icon, Explorer will likely keep
    // using the old one that it's already got in the system cache.
    SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD | SHCNF_FLUSHNOWAIT, &imageIndex, NULL);
}
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW | SHCNF_FLUSHNOWAIT, wPath, NULL);
0
ответ дан 10 December 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: