我制作了一个firefox插件,一个配置文件管理器,他们可以从中管理所有配置文件。此插件允许多个配置文件。 Profile是一组具有不同PID的firefox窗口。
在我运行此代码的配置文件中,图标成功更改。是否可以更改另一个配置文件的图标(如果它正在运行,如果它没有运行它不是问题)?
我有PID,我枚举了窗口,并得到了一个窗口句柄。它上面有SetClassLongPtr
,但它似乎没有改变或错误。
这是我用来更新图标的代码:
var hIconBig_HANDLE = ostypes.API('LoadImage')(null, iconPath, ostypes.CONST.IMAGE_ICON, 256, 256, ostypes.CONST.LR_LOADFROMFILE); //todo: detect if winxp and if so then use 32 instead of 256 per https://gist.github.com/Noitidart/0f55b7ca0f89fe2610fa#file-_ff-addon-snippet-browseforbadgethencreatesaveanapply-js-L328
var hIconSmall_HANDLE = ostypes.API('LoadImage')(null, iconPath, ostypes.CONST.IMAGE_ICON, 16, 16, ostypes.CONST.LR_LOADFROMFILE);
// LoadImage was returning null because i had declared LoadImageA but then i defeined LPCTSTR as ctypes.jschar. i had to use LoadImageW to use with ctypes.jschar. I didnt test but i guess to use with LoadImageA you have to use ctypes.char
var hIconBig_LONG_PTR = ctypes.cast(hIconBig_HANDLE, ostypes.IS64BIT ? ostypes.TYPE.LONG_PTR : ostypes.TYPE.LONG);
var hIconSmall_LONG_PTR = ctypes.cast(hIconSmall_HANDLE, ostypes.IS64BIT ? ostypes.TYPE.LONG_PTR : ostypes.TYPE.LONG);
var oldBigIcon = ostypes.API('SetClassLong')(cHwnd, ostypes.CONST.GCLP_HICON, hIconBig_LONG_PTR);
var oldSmallIcon = ostypes.API('SetClassLong')(cHwnd, ostypes.CONST.GCLP_HICONSM, hIconSmall_LONG_PTR);
由于
是否可以使用SendMessage
以与SetClassLongPtr
相同的方式更改图标?那将是完美的!我强烈希望避免使用SendMessage
和WM_SETICON
,因为这会产生一些影响(请参阅下面的评论)