要求是在当前桌面中打开所有窗口。 我试图从node-ffi调用EnumWindows,它将处理程序长度设置为0。
节点参考链接:node-ffi module
我的代码段:
/**
@Name :Parthasarathy Balakrishnan
@Version : V0.1
@Date : 18/03/2013 */
var ffi = require('ffi'),
ref = require('ref'),
int = ref.types.int,
assert = require('assert'),
bindings = require('bindings'),
buffer = require('buffer')
var user32,Kernel32;
var lpEnumFunc;
var invokeCount=0;
/**EnumWindows API CALL
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc,_In_ LPARAM lParam);
Parameters
lpEnumFunc [in]
Type: WNDENUMPROC
A pointer to an application-defined callback function. For more information, see EnumWindowsProc.
lParam [in]
Type: LPARAM
An application-defined value to be passed to the callback function.
**/
user32 = new ffi.Library('user32', {'EnumWindows':[ 'bool', ['pointer','int32'] ], // BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc,_In_ LPARAM lParam);
'GetWindowTextW':[ 'int32', ['pointer','pointer','int32']]});
Kernel32 = new ffi.Library('kernel32', {'GetLastError':['bool', ['pointer','int32'] ]}); // Not required for this demo
lpEnumFunc = ffi.Callback('bool',['pointer','int32'],function (hwnd,lParam){
console.log("------------------START---------------------")
console.log(hwnd);
console.log(ref.getType(hwnd));
console.log("Is Buffer/Pointer NULL :\t"+ref.isNull(hwnd));
console.log("lParam :\t"+lParam)
console.log("EnumWindows Callback handler : \t "+hwnd.length);
//Pointer implementations-start
var buf = new Buffer(ref.sizeof.pointer);
ref.writePointer(buf, 0, hwnd);
var out = ref.readPointer(buf, 0, hwnd.length)
for (var i = 0, l = out.length; i < l; i++) {
console.log(out[i])
}
//Pointer implementations-end
console.log("ref address :\t"+ref.address(hwnd));
console.log("------------------END---------------------")
return true;
});
console.log("Calling EnumWindows init");
var bool = user32.EnumWindows(lpEnumFunc,0);
console.log("EnumWindows return value :\t"+bool);
// register the callback function
process.on('uncaughtException', function () {
console.error('uncaught:', arguments);
});
输出:
Calling EnumWindows init
------------------START---------------------
{ size: 0,
indirection: 1,
get: [Function: get],
set: [Function: set],
name: 'void',
ffi_type: }
Is Buffer/Pointer NULL : false
lParam : 0
EnumWindows Callback handler : 0
ref address : 197424
------------------END---------------------
从输出中我得到Handler大小为0.
我做错了什么?
答案 0 :(得分:1)
我不赞成任何这个代码,它只是这里的另一个答案,修复然后转换为常规Javascript而不是Coffee Script
var ref = require('ref');
var ffi = require('ffi');
var voidPtr = ref.refType(ref.types.void);
var stringPtr = ref.refType(ref.types.CString);
var user32 = ffi.Library('user32.dll', {
EnumWindows: ['bool', [voidPtr, 'int32']],
GetWindowTextA : ['long', ['long', stringPtr, 'long']]
});
windowProc = ffi.Callback('bool', ['long', 'int32'], function(hwnd, lParam) {
var buf, name, ret;
buf = new Buffer(255);
ret = user32.GetWindowTextA(hwnd, buf, 255);
name = ref.readCString(buf, 0);
console.log(name);
return true;
});
user32.EnumWindows(windowProc, 0);
答案 1 :(得分:0)
您似乎将'hwnd'视为指针,认为您可以简单地使用int或long。 这对我有用(coffeescript):
ref = require 'ref'
ffi = require 'ffi
voidPtr = ref.refType(ref.types.void)
stringPtr = ref.refType(ref.types.CString)
bindings =
EnumWindows: ['bool', [voidPtr, 'int32']]
GetWindowTextA : ['long', ['long', stringPtr, 'long']]
user32 = ffi.Library('user32.dll', bindings)
windowProc = ffi.Callback 'bool', ['long', 'int32'], (hwnd, lParam) ->
buf = new Buffer 255
ret = libm.GetWindowTextA hwnd, buf, 255
name = ref.readCString(buf, 0)
console.log name
true
user32.EnumWindows windowProc, 0