设置Windows问题的图标(WinXP和Win7)

时间:2014-06-04 03:54:19

标签: c++ firefox-addon icons user32 jsctypes

我正在使用js-ctypes创建一个Firefox插件,并使用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();

问题如下:

WinXP上的问题

  • Alt + Tab时图标为正常图标
  • 如果将窗口集中到一个组中(由于任务栏溢出)并且所有图标都已更改,则集总组图标仍然不是更改的图标。如图中所示:

    _ff-addon-snippet-ChangeWindowIcon.js - Rev1 -- WinXP lumped icon issue.PNG

Win7上的问题

  • 如果应用程序 IS PINNED ,即使所有窗口图标都更改为相同,它仍然不会更改图钉图标
  • 如果应用程序 NOT PINNED ,那么如果更改所有窗口的图标,如果右键单击任务栏中的图标,它将更改任务栏上的图标 HOWEVER 它恢复到正常状态,并再次运行上面的代码片段,不再将其设置回来,将其恢复为你设置的图标,你必须固定并取消固定

1 个答案:

答案 0 :(得分:1)

你真的不应该在一个问题中提出这么多问题 ......

  

按Alt + Tab时,图标为正常图标

您正在尝试加载和设置256x256图标。 XP不支持这样的图标。你应该添加一些错误检查;) IIRC你应该为大一个设置32x32图标。或者更准确地说是SM_CXICON and/or SM_CXSMICON

  

如果将窗口集中到一个组中(由于任务栏溢出)并且所有图标都已更改,则集总组图标仍然不是更改的图标。如图中所示:

我觉得你对这个不太好运。 XP将采用.exe IIRC中的主要资源图标。

无论如何,XP已经死了......

  

Win 7上的问题

IIRC你必须使用System.AppUserModel.RelaunchIcon ...

修改的 实际上我对XP分组的东西可能是错的。不久前,最后在win32上乱用图标。 GCLP_HICON/GCLP_HICONSM 可能工作。