2013-03-19 41 views
3

要求是讓當前桌面上的所有窗口都打開。 我試圖調用從節點FFI EnumWindows的賦予處理長度爲0node-ffi - EnumWindows的回調提取

節點參考鏈接: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--------------------- 

從輸出我得到處理程序大小爲0.

我在做什麼錯?

回答

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 
0

我不邀功此代碼的任何,它僅僅是在這裏的其他答案,修復,然後轉換成規則的Javascript,而不是咖啡腳本

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); 
+0

我把它做成了一個模塊,[node-hide](https://www.npmjs.com/package/node-hide) – Ducky 2016-06-11 06:53:39