Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过Firefox JS ctypes创建Win32窗口_Javascript_Winapi_Firefox - Fatal编程技术网

Javascript 通过Firefox JS ctypes创建Win32窗口

Javascript 通过Firefox JS ctypes创建Win32窗口,javascript,winapi,firefox,Javascript,Winapi,Firefox,我正试图根据本教程创建一个Win32窗口 Firefox JS ctypes代码如下: "use strict"; Components.utils.import("resource://gre/modules/ctypes.jsm"); var user32 = ctypes.open("user32.dll"); var kernel32 = ctypes.open("kernel32.dll"); const HWND_MESSAGE = -3; const WM_COPYDATA

我正试图根据本教程创建一个Win32窗口

Firefox JS ctypes代码如下:

"use strict";
Components.utils.import("resource://gre/modules/ctypes.jsm");

var user32 = ctypes.open("user32.dll");
var kernel32 = ctypes.open("kernel32.dll");

const HWND_MESSAGE = -3; 
const WM_COPYDATA = 74;

var lpszClassName = ctypes.char.array()("Modus RP Class");    
var lpszWindowName = ctypes.char.array()("Modus RP");

const COPYDATASTRUCT = ctypes.StructType("COPYDATASTRUCT",
    [ 
      {dwData: ctypes.uintptr_t},
      {cbData: ctypes.uint32_t},
      {lpData: ctypes.voidptr_t}
    ]);    

var DefWindowProc = user32.declare("DefWindowProcA", ctypes.winapi_abi, ctypes.int,
    ctypes.voidptr_t, ctypes.int32_t, ctypes.int32_t, ctypes.int32_t);

var ShowWindow = user32.declare("ShowWindow", 
    ctypes.winapi_abi, ctypes.bool, ctypes.voidptr_t, ctypes.int32_t);

var UpdateWindow = user32.declare("UpdateWindow", 
    ctypes.winapi_abi, ctypes.bool, ctypes.voidptr_t);          

function windowProcJSCallback(hWnd, uMsg, wParam, lParam) {
  if (uMsg == WM_COPYDATA) {
    var CD = COPYDATASTRUCT.ptr(lParam).contents;
    var s = ctypes.cast(CD.lpData, ctypes.jschar.ptr).readString();
    alert(s);
    return ctypes.int(0);
  } else 
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

var WindowProcType = ctypes.FunctionType(ctypes.stdcall_abi, ctypes.int,
    [ctypes.voidptr_t, ctypes.int32_t, ctypes.int32_t, ctypes.int32_t]).ptr;
var WindowProcPointer = WindowProcType(windowProcJSCallback);
var WNDCLASS = ctypes.StructType("WNDCLASS",
    [
      { style: ctypes.uint32_t },
      { lpfnWndProc: WindowProcType }, 
      { cbClsExtra: ctypes.int32_t },
      { cbWndExtra: ctypes.int32_t },
      { hInstance: ctypes.voidptr_t },
      { hIcon: ctypes.voidptr_t },
      { hCursor: ctypes.voidptr_t },
      { hbrBackground: ctypes.voidptr_t },
      { lpszMenuName: ctypes.char.ptr },
      { lpszClassName: ctypes.char.ptr }
    ]);

var GetModuleHandle = kernel32.declare("GetModuleHandleA", ctypes.winapi_abi, 
ctypes.voidptr_t, ctypes.char.ptr);    
var hInstance = GetModuleHandle(null);    

var wndclass = WNDCLASS();
wndclass.hInstance = hInstance;
wndclass.lpszClassName = lpszClassName;
wndclass.lpfnWndProc = WindowProcPointer;   

var RegisterClass = user32.declare("RegisterClassA", ctypes.winapi_abi, 
    ctypes.uint32_t, WNDCLASS.ptr);
var UnregisterClass = user32.declare("UnregisterClassA", ctypes.winapi_abi, 
    ctypes.bool, ctypes.char.ptr, ctypes.voidptr_t);
var DestroyWindow = user32.declare("DestroyWindow", ctypes.winapi_abi, 
    ctypes.bool, ctypes.voidptr_t);

RegisterClass(wndclass.address());

var CreateWindowEx = user32.declare("CreateWindowExA", ctypes.winapi_abi, 
    ctypes.voidptr_t, ctypes.int, ctypes.char.ptr, ctypes.char.ptr, ctypes.int, 
    ctypes.int, ctypes.int, ctypes.int, ctypes.int, ctypes.voidptr_t, 
    ctypes.voidptr_t, ctypes.voidptr_t, ctypes.voidptr_t);

var win = CreateWindowEx(0, lpszClassName, lpszWindowName, 0xcf0000, 500, 260, 240, 120, 
    null, null, hInstance, null);  

ShowWindow(win,5);
UpdateWindow(win);

const WPARAM = ctypes.int32_t;
//const LPARAM = ctypes.PointerType(COPYDATASTRUCT);
const LPARAM = ctypes.size_t;

var POINT = ctypes.StructType("POINT",
[
 { x : ctypes.int },
 { y : ctypes.int }
]);

var MSG = ctypes.StructType("MSG",
[
 { hWnd : ctypes.voidptr_t },
 { message : ctypes.int },
 { wParam : WPARAM },
 { lParam : LPARAM },
 { time : ctypes.int },
 { pt : POINT}
]);

var TranslateMessage = user32.declare("TranslateMessage", 
    ctypes.winapi_abi, ctypes.bool, MSG.ptr);   

var DispatchMessage  = user32.declare("DispatchMessageW", 
    ctypes.winapi_abi, ctypes.uint32_t, MSG.ptr);   

var GetMessage = user32.declare("GetMessageW", 
    ctypes.winapi_abi, ctypes.bool, MSG.ptr, ctypes.voidptr_t, ctypes.int32_t, ctypes.int32_t);

var messg= MSG();
while(GetMessage(messg.address(),win,0,0)){
    TranslateMessage(messg.address());
    DispatchMessage(messg.address());
}
窗口创建成功,但在移动窗口并等待一段时间后,Firefox没有响应


我是否编写了错误的代码,或者由于JS ctypes的性能损失,本机窗口创建超出了Firefox的范围?

您正在运行一个消息循环。这是在哪一条线上发生的?谢谢。我对Win32 api相当陌生。我不确定它在哪根线上运行。但是我可以在
windowProcJSCallback
函数中记录
console.log
消息,并在Firefox控制台中查看结果。这可能意味着消息循环连接到Firefox。我认为您确实需要了解线程模型,以及在该函数中运行消息循环的含义。您是否意识到问题中的代码不会在您创建的窗口仍在显示时终止?我想说的是,除非你在Win32上有良好的基础,否则你会发现沿着这条道路很难取得进展。