WM_GETICON не работает (Windows)

Если я сначала не использую WM_SETICON для установки значка, тогда WM_GETICON всегда возвращает 0. Это странно. Пожалуйста помоги.

Это мой код, можно скопировать вставить в блокнот и запустить.

При выполнении SendMessage(targetWindow_handle, WM_GETICON , ICON_SMALL, ctypes.voidptr_t(0)), hIconSmall_orig и hIconBig_orig всегда возвращается 0, я понятия не имею, почему. ЕСЛИ вы сначала нажмете WM_SETICON в окне, тогда он правильно получит HICON, но вся цель состоит в том, чтобы получить значок по умолчанию.

Cu.import('resource://gre/modules/ctypes.jsm');

var user32 = ctypes.open('user32.dll');

/* http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx
 * LRESULT WINAPI SendMessage(
 * __in HWND hWnd,
 * __in UINT Msg,
 * __in WPARAM wParam,
 * __in LPARAM lParam
 * );
 */
var SendMessage = user32.declare('SendMessageW', ctypes.winapi_abi, ctypes.uintptr_t,
    ctypes.voidptr_t,
    ctypes.unsigned_int,
    ctypes.int32_t,
    ctypes.voidptr_t
);

var WM_GETICON = 0x007F;
var WM_SETICON = 0x0080;
var ICON_SMALL = 0;
var ICON_BIG = 1;
var ICON_SMALL2 = 2; //for use with WM_GETICON only, not applicable to WM_SETICON

// RUNNING STUFF BELOW - ABVOE WAS JUST DEFINING STUFF
var baseWindow = window.QueryInterface(Ci.nsIInterfaceRequestor)
                       .getInterface(Ci.nsIWebNavigation)
                       .QueryInterface(Ci.nsIDocShellTreeItem)
                       .treeOwner
                       .QueryInterface(Ci.nsIInterfaceRequestor)
                       .nsIBaseWindow;

var nativeHandle = baseWindow.nativeHandle;
var targetWindow_handle = ctypes.voidptr_t(ctypes.UInt64(nativeHandle));

var hIconSmall_orig = SendMessage(targetWindow_handle, WM_GETICON , ICON_SMALL, ctypes.voidptr_t(0));
var hIconBig_orig = SendMessage(targetWindow_handle, WM_GETICON , ICON_BIG, ctypes.voidptr_t(0));
Services.wm.getMostRecentWindow(null).alert('hIconSmall_orig = ' + hIconSmall_orig + '\nhIconBig_orig = ' + hIconBig_orig);

user32.close();

person Noitidart    schedule 04.06.2014    source источник
comment
Могу я спросить, цель состоит в том, чтобы получить значок firefox.exe?   -  person paa    schedule 05.06.2014
comment
Первоначально это было, но я пропускаю это сейчас. Затем я перешел на ExtractIconEx, но потом понял, что просто упаковал путь к значку и не нужно извлекать значки с помощью js-ctypes. Так что теперь это просто из любопытства.   -  person Noitidart    schedule 05.06.2014
comment
Спасибо всем за отмену репутации, которую я получил за это. Цените это, ребята.   -  person Noitidart    schedule 05.06.2014


Ответы (2)


Поскольку вы получили от меня материал WM_GETICON (в другом ответе на другой вопрос), позвольте мне сначала сказать: это было какое-то время... Итак, я забыл, что WM_GETICON вернет ноль, когда окну не назначен конкретный значок окна, но вместо этого icon берется из зарегистрированного класса окна.

Итак, вам следует:

  1. Проверьте WM_GETICON, чтобы узнать, назначен ли окну определенный значок.
  2. Проверьте класс по GetClassLongPtr(hwnd, GCLP_HICON /* or GCLP_HICONSM */)
  3. Если это не поможет, вы всегда можете попробовать загрузить основную иконку из .exe
  4. Если это не поможет, вы всегда можете попробовать загрузить стандартную иконку.

Вот код C++, который я использую для получения значка из окна в моем расширении "mintrayr":

  // Get the window icon
  HICON icon = reinterpret_cast<HICON>(::SendMessageW(hwnd, WM_GETICON, ICON_SMALL, 0));
  if (icon == 0) {
    // Alternative method. Get from the window class
    icon = reinterpret_cast<HICON>(::GetClassLongPtrW(hwnd, GCLP_HICONSM));
  }
  // Alternative method: get the first icon from the main module (executable image of the process)
  if (icon == 0) {
    icon = ::LoadIcon(GetModuleHandleW(0), MAKEINTRESOURCE(0));
  }
  // Alternative method. Use OS default icon
  if (icon == 0) {
    icon = ::LoadIcon(0, IDI_APPLICATION);
  }
person nmaier    schedule 05.06.2014
comment
Искреннее спасибо мужик! Я собираюсь отложить это на данный момент, так как для моего аддона мне просто нужны пути к значку firefox png, и я положу его на холст, затем отметлю его, затем сохраните в ico, а затем установите значок. Но я собираюсь вернуться к этому из любопытства позже. :) - person Noitidart; 05.06.2014
comment
Итак, вы хотите сказать, что намеренно хотите сломать мои драгоценные, превосходно оформленные пользовательские значки окон, которые некоторые из моих надстроек используют в своих окнах? :п - person nmaier; 05.06.2014
comment
Ах хахахаха. Вот о чем я беспокоился. Но потом я подумал, может быть, у людей нет пользовательских значков. Спасибо, что дал мне знать человека. :) - person Noitidart; 05.06.2014
comment
Просто любопытство: почему вы не сделали этого в js-ctypes в аддоне mintrar? Это причины производительности или что-то в этом роде? - person Noitidart; 06.02.2015

Что ж, есть удивительно простой (и кроссплатформенный) способ получить значок Firefox по умолчанию.

var foxexe = FileUtils.getFile("XREExeF", []);
var iconurl = "moz-icon:" + Services.io.newFileURI(foxexe).spec;

Вы можете относиться к iconurl так же, как и к любому другому URL-адресу, указывающему на изображение. Размер по умолчанию — 16x16, добавьте ?size=32, чтобы увеличить значок. Кажется, что эти два значения поддерживаются только в Windows. Это может быть не так для других ОС.

person paa    schedule 05.06.2014
comment
Супер супер! Спасибо чувак!! Это ответ на мой вопрос здесь: ask.mozilla. org/question/751/path-to-the-builds-icon - person Noitidart; 05.06.2014
comment
Как ты узнал этого человека? Также это возвращается как png? - person Noitidart; 05.06.2014
comment
Блин качество на иконке полученной таким образом для 16 заметно убогое, вы тоже самое заметили? 32px один хорош. Я использую WinXP. Я проверю это на Win7 и посмотрю, что случилось. - person Noitidart; 05.06.2014
comment
Папка с брендингом имеет качественные значки: mxr.mozilla .org/mozilla-release/source/browser/branding/nightly/, но как сделать их разных размеров, не размывая их? - person Noitidart; 05.06.2014
comment
Мне нужно было сделать это, потому что я делал ярлык для firefox со значком по умолчанию для firefox.exe :( - person Noitidart; 23.09.2014
comment
У меня сложилось впечатление, что запрос исполняемого файла через moz-icon даст соответствующий значок. По-видимому, это верно только для исполняемых файлов Windows. - person paa; 23.09.2014
comment
Спасибо, чувак, за подтверждение, мне было интересно, может быть, я испортил. Просто чтобы перепроверить, проблема не в том, что я указал размер 16 для Linux и Mac, не так ли? другие размеры не пробовал. Надо будет попробовать сегодня. - person Noitidart; 23.09.2014