如何将退出命令发送到当前的 ffmpeg.exe

How can I send quit command to current ffmpeg.exe

本文关键字:ffmpeg exe 退出 命令      更新时间:2023-09-26
 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 配合

使用

谢谢。。

这不是一件小事 - Firefox 没有任何内置功能,这意味着您需要为此使用 js-ctypes 并直接调用 Win32 API 函数。Win32 - 获取应用程序的主 Wnd 句柄描述了如何获取应用程序的顶级窗口,之后可以向其发送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(这显然是一种不太可靠的方法)。