0
 var fpath="C:\\TVT_"+cur_date+"_"+cur_time+".avi";

 Components.utils.import("resource://gre/modules/FileUtils.jsm");

 var env = Components.classes["@mozilla.org/process/environment;1"]
                .getService(Components.interfaces.nsIEnvironment);
 var shell = new FileUtils.File(env.get("COMSPEC"));

 var args = ["/c", "cd.. & cd.. & C: & cd C:/ffmpeg/bin & record.bat "+fpath];

 var process = Components.classes["@mozilla.org/process/util;1"]
                 .createInstance(Components.interfaces.nsIProcess);
 process.init(shell);
 process.runAsync(args, args.length);
  1. 我不想使用 taskkill.exe、/MIN、/C、/B,而是想退出这个 ffmpeg 进程
  2. 我阅读了有关 CMDOW 的信息,但没有在 system32 目录中找到 cmdow.exe。
  3. 那么如何在运行 ffmpeg 进程的同一窗口中发送退出命令?

将 Windows XP Service Pack 2 与 Firefox 12 一起使用

谢谢..

4

1 回答 1

0

这不是微不足道的 - Firefox 没有任何内置功能,这意味着您需要为此使用js-ctypes并直接调用 Win32 API 函数。Win32 - Get Main Wnd Handle of application描述了如何获取应用程序的顶级窗口,然后您可以向WM_QUIT它发送消息。这种方法实际上有效:

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

var userlib = ctypes.open("user32");

var HWND = ctypes.voidptr_t;
var UINT = ctypes.uint32_t;
var WPARAM = ctypes.uint16_t;
var LPARAM = ctypes.uint32_t;
var LRESULT = ctypes.uint32_t;
var DWORD = ctypes.uint32_t;
var WNDENUMPROC = ctypes.FunctionType(ctypes.stdcall_abi,
                                      ctypes.bool,
                                      [HWND, LPARAM]).ptr;
var WM_CLOSE = 0x0010;

var EnumWindows = userlib.declare(
  "EnumWindows", ctypes.winapi_abi,
  ctypes.bool,
  WNDENUMPROC, LPARAM
);

var GetWindowThreadProcessId = userlib.declare(
  "GetWindowThreadProcessId", ctypes.winapi_abi,
  DWORD,
  HWND, DWORD.ptr
);

var IsWindowVisible = userlib.declare(
  "IsWindowVisible", ctypes.winapi_abi,
  ctypes.bool,
  HWND
);

var SendMessage = userlib.declare(
  "SendMessageW", ctypes.winapi_abi,
  LRESULT,
  HWND, UINT, WPARAM, LPARAM
);

var callback = WNDENUMPROC(function(hWnd, lParam)
{
  var procId = DWORD();
  GetWindowThreadProcessId(hWnd, procId.address());
  if (procId.value == pid && IsWindowVisible(hWnd))
    SendMessage(hWnd, WM_CLOSE, 0, 0);
  return true;
});
EnumWindows(callback, 0);

userlib.close();

我对此进行了测试,并且可以使用它成功关闭记事本窗口(如果尚未保存文本,则会出现通常的警告,因此它是干净的关闭)。但是,在您的情况下,问题可能是您没有直接运行 ffmpeg,而是通过命令行 shell - 因此您将关闭可能不会终止 ffmpeg 的命令行窗口。我想你只需要尝试一下,如果它不起作用,你可能不得不查看窗口的标题而不是它的进程 ID(这显然是一种不太可靠的方法)。

于 2012-05-25T12:23:43.590 回答