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();

0

Решение

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

Итак, вы должны:

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

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

  // 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);
}
2

Другие решения

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

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

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

1

По вопросам рекламы [email protected]