作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个未记录的 winapi fetarue,名为 setConsoleIcon
。我在这里和这个人讨论过:
https://github.com/john-peterson/john-peterson/issues/1#issuecomment-47852560
C++代码是这样的:
void SetIcon(LPCTSTR icon) {
HMODULE hMainMod = GetModuleHandle(NULL);
HICON hMainIcon = ::LoadIcon(hMainMod, icon);
HMODULE hMod = LoadLibraryA("Kernel32.dll");
typedef BOOL (CALLBACK *InsHook)(unsigned long, HANDLE);
typedef DWORD (__stdcall *SCI)(HICON);
SCI pfnSetConsoleIcon = reinterpret_cast<SCI>(GetProcAddress(hMod, "SetConsoleIcon"));
pfnSetConsoleIcon(hMainIcon);
FreeLibrary(hMod);
}
我将其转换为:
Cu.import('resource://gre/modules/ctypes.jsm');
var kernel32 = ctypes.open('kernel32.dll');
var user32 = ctypes.open('user32.dll');
var SetConsoleIcon = kernel32.declare('SetConsoleIcon', ctypes.winapi_abi, ctypes.voidptr_t, // i have no idea what return value is so made it voidptr_t
ctypes.voidptr_t // HICON
);
/* http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx
* HANDLE WINAPI LoadImage(
* __in_opt_ HINSTANCE hinst,
* __in_ LPCTSTR lpszName,
* __in_ UINT uType,
* __in_ int cxDesired,
* __in_ int cyDesired,
* __in_ UINT fuLoad
* );
*/
var LoadImage = user32.declare('LoadImageA', ctypes.winapi_abi, ctypes.voidptr_t,
ctypes.voidptr_t,
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;
var aDOMWindow = window;
var baseWindow = aDOMWindow.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 hIconBig = LoadImage(targetWindow_handle, 'C:\\Users\\noit\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\1agqx535.default2\\profilist32.ico', IMAGE_ICON, 256, 256, LR_LOADFROMFILE);
var hIconBigNull = LoadImage(null, 'C:\\Users\\noit\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\1agqx535.default2\\profilist32.ico', IMAGE_ICON, 256, 256, LR_LOADFROMFILE);
var void = SetConsoleIcon(hIconBig); //SetConsoleIcon(hIconBigNull);
如果您注释掉最后一行并复制并运行它,则不会出现任何问题。
但是,如果您取消注释并将其与 hIconBig
或 hIconBigNull
一起使用,则会收到此错误:(两者之间的区别是,对 hIconBig
传递窗口句柄,对 hIconBigNull
我传递 null 作为句柄)
/*
"missing variable name
WCA_evalWithDebugger@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/actors/webconsole.js:1069:7
WCA_onEvaluateJS@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/actors/webconsole.js:734:9
DSC_onPacket@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/server/main.js:1098:9
LDT_send/<@resource://gre/modules/devtools/dbg-client.jsm -> resource://gre/modules/devtools/server/transport.js:279:11
makeInfallible/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/devtools/DevToolsUtils.js:84:7"
*/
我无法解释这个缺少变量名
。有什么想法吗?
最佳答案
这里的问题是你的var void = ...
。 void
是 Javascript 中的保留关键字,因此不能用作变量名。
其他随机观察:
void
函数或不关心返回值的函数时,请使用 ctypes.void_t
。LoadImage
带窗 Handlebars 。应该使用模块句柄或 null 来调用它。您需要使用 null 来调用它,因为您正在加载独立图像。GetConsoleWindow()
获取控制台窗口句柄,然后发送 WM_SETICON
效果很好,这就是使用记录的功能。关于javascript - setConsoleIcon 抛出奇怪的错误(未记录的 WinAPI 到 JS-Ctypes),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566535/
有一个未记录的 winapi fetarue,名为 setConsoleIcon。我在这里和这个人讨论过: https://github.com/john-peterson/john-peterson
我是一名优秀的程序员,十分优秀!