Я делаю аддон Firefox с js-ctypes и использовал функции user32.dll для установки значков всех окон профиля.
Я планирую сделать это для Mac OS и Linux, но сначала пытаюсь выбить Windows.
Итак, я устанавливаю значки следующим образом: GitHub — Gist :: Noitidart / _ff-addon-snippet-ChangeWindowIcon.js — Rev2
Этот код упрощен. Этот код я использую для применения ко всем окнам:
Cu.import('resource://gre/modules/ctypes.jsm');
var user32 = ctypes.open('user32.dll');
var SendMessage = user32.declare('SendMessageW', ctypes.winapi_abi, ctypes.uintptr_t,
ctypes.int32_t,
ctypes.unsigned_int,
ctypes.int32_t,
ctypes.voidptr_t
);
var LoadImage = user32.declare('LoadImageA', ctypes.winapi_abi, ctypes.voidptr_t,
ctypes.int,
ctypes.char.ptr,
ctypes.unsigned_int,
ctypes.int,
ctypes.int,
ctypes.unsigned_int
);
var IMAGE_BITMAP = 0;
var IMAGE_ICON = 1;
var LR_LOADFROMFILE = 16;// RUNNING STUFF BELOW - ABVOE WAS JUST DEFINING STUFF
var DOMWindows = Services.wm.getEnumerator(null);
while (DOMWindows.hasMoreElements()) {
var aDOMWindow = DOMWindows.getNext();
var basewindow = aDOMWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.treeOwner
.QueryInterface(Ci.nsIInterfaceRequestor)
.nsIBaseWindow;
var nativeHandle = basewindow.nativeHandle;
var targetWindow_handle = parseInt(nativeHandle);
var hIconBig = LoadImage(targetWindow_handle, 'C:\\Documents and Settings\\SONY VAIO\\My Documents\\Downloads\\puzzle.ico', IMAGE_ICON, 256, 256, LR_LOADFROMFILE); //MUST BE A FILEPATH TO A ICO!!!
var hIconSmall = LoadImage(targetWindow_handle, 'C:\\Documents and Settings\\SONY VAIO\\My Documents\\Downloads\\puzzle.ico', IMAGE_ICON, 16, 16, LR_LOADFROMFILE); //MUST BE A FILEPATH TO A ICO!!!
var successSmall = SendMessage(targetWindow_handle, 0x0080 /** WM_SETICON **/ , 0 /** ICON_SMALL **/ , hIconSmall); //if it was success it will return 0? im not sure. on first time running it, and it was succesful it returns 0 for some reason
var successBig = SendMessage(targetWindow_handle, 0x0080 /** WM_SETICON **/ , 1 /** ICON_BIG **/ , hIconBig); //if it was success it will return 0? im not sure. on first time running it, and it was succesful it returns 0 for some reason
}
user32.close();
Проблемы заключаются в следующем:
Alt
+ Tab
значок нормальныйЕсли окна объединены в одну группу (из-за переполнения панели задач) и значки ВСЕ изменены, значок с сосредоточенными группами все еще не изменен. Как видно на рисунке здесь:
Вы действительно не должны ставить так много вопросов в один вопрос…
При нажатии Alt + Tab иконка нормальная
Вы пытаетесь загрузить и установить 256×256 иконок. XP не поддерживает такие иконки. Вы действительно должны добавить некоторые проверки ошибок;)
IIRC вы должны установить 32×32 иконки для большой. Или точнее SM_CXICON
и / или SM_CXSMICON
Если окна объединены в одну группу (из-за переполнения панели задач) и значки ВСЕ изменены, значок с сосредоточенными группами все еще не изменен. Как видно на рисунке здесь:
Я думаю, тебе не повезло в этом. XP возьмет любой значок, который является основным значком ресурса в .exe
IIRC.
ХР все равно мертва …
Проблемы на Win 7
С IIRC вам придется работать System.AppUserModel.RelaunchIcon…
редактировать
На самом деле я могу ошибаться в отношении группировки XP. Последние возились с иконками на win32 довольно давно. GCLP_HICON
/GCLP_HICONSM
может быть Работа.