node-ffi - callback extraction of EnumWindows

node.js

Solution

I do not take credit for any of this code, it is merely the other answer on here, fix and then converted to regular Javascript instead of 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);

Problem

Requirement is to get all windows open in current desktop. I am trying to invoke EnumWindows from node-ffi which gives handler length as 0. node reference link: node-ffi module My Code Snippet: ``` /** @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); }); ``` Output: ``` 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--------------------- ``` From the output I am getting Handler size as 0. What am I doing wrong?

Original source