我一直缺乏睡眠,所以我超级杀了这个。

我想做的是从任务栏按钮从窗口获取句柄。在此遵循本教程:http://www.codeproject.com/Articles/10497/A-tool-to-order-the-window-buttons-in-your-taskbar。这是具体部分:


  获取窗口句柄
  
  这是真正幸运的部分。我对自己说:“我在哪里
  保持窗户把手吗?”。他们必须将其放在某个地方,以启用
  选择按钮后激活正确的窗口。的
  保留它的明显位置是每个按钮的结构中,并且
  保持指向此结构的指针的明显位置是
  每个TBBUTTON的dwData字段。
  
  所以我看了看dwData字段,它们似乎是
  指针。到目前为止还可以。然后我看了他们指出的记忆,
  在那里:第一个字段存储了窗口句柄。
  :)))毕竟,Microsoft开发人员并没有太大不同。 :)


因此,我成功获得了任务栏按钮,如下所示:

无论如何,这就是我得到local_tbb的方式:

remote_tbb = ralloc_alloc(struct_TBButton.size);
var rez = SendMessage(hToolbar, TB_GETBUTTON, i, ctypes.voidptr_t(remote_tbb));
if (!rez) { throw new Error('Failed on SendMessage of TB_GETBUTTON'); }

var local_tbb = new struct_TBButton();
var retRead = ralloc_read(remote_tbb, local_tbb.address());
var freed = ralloc_free(remote_tbb);
console.log('freed', freed);

for (var n in local_tbb) {
    console.log(n, local_tbb[n]);
    try {
        console.log('toString', n, local_tbb[n].toString());
    } catch (ignore) {}
}


并成功填充dwData字段。从此console.log开始是在dwData上执行此操作的时间:

"dwData" UInt64 {  }
"toString" "dwData" "1499288"


所以现在我想做那个家伙说的和Then I had a look at the memory they pointed to。所以我正在努力做到这一点。

所以我知道我必须做这样的事情,但是应该在SendMessage中输入什么IPC命令(当前我使用的是0x004A /** WM_COPYDATA **/,但这是不对的),我应该将local_tbb.dwData放在哪里地址?

    var remote_hwnd = ralloc_alloc(ctypes.voidptr_t.size);
    var smHwndRez = SendMessage(hToolbar, 0x004A /** WM_COPYDATA **/, local_tbb.idCommand, ctypes.voidptr_t(remote_hwnd));
    console.log('smHwndRez=', smHwndRez);

    var local_hwnd = ctypes.voidptr_t;
    var retRead = ralloc_read(remote_hwnd, local_hwnd.address());
    console.log('retRead=', retRead);

    var freed = ralloc_free(remote_hwnd);
    console.log('freed=', freed);

    console.log('local_hwnd = ', local_hwnd, local_hwnd.toString(), uneval(local_hwnd));

最佳答案

严格来说,这不是winapi,因为这不是API的一部分,而是未记录的实现细节。

从我可以收集到的信息:


获取TBBUTTON数据。
.dwData包含指向多个(?)HANDLE s(voidptr_t s)的指针
因此,将.dwData重新解释为voidptr_t,即new ctypes.voidptr_t(.dwData);
使用ReadProcessMemory.dwData指向的位置读取另一个指针。那是(应该是)您的窗口句柄。


所以像这样:

var tbb = new TBButton();
...
var dataPtr = new ctypes.voidptr_t(tbb.dwData);
var handle = new ctypes.voidptr_t();
// Important: pass the address of |handle|, not |handle| itself.
if (!ReadProcessMemory(process, dataPtr, handle.address(), ctypes.voidptr_t.size, null)) {
  throw new Error("Failed to read window handle");
}

10-08 03:21