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 プロセスを実行している同じウィンドウ内で終了コマンドを送信するにはどうすればよいですか?

Firefox 12 で Windows XP Service Pack 2 を使用する

ありがとう..

4

1 に答える 1

0

これはそれほど簡単なことではありません。Firefoxにはそのための組み込み機能がないため、js-ctypesを使用して、Win32API関数を直接呼び出す必要があります。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を直接実行しておらず、コマンドラインシェルを介して実行している可能性があります。そのため、ffmpegを終了しない可能性のあるコマンドラインウィンドウを閉じます。試してみる必要があると思います。うまくいかない場合は、プロセスIDではなくウィンドウのタイトルを確認する必要があります(これは明らかに信頼性の低いアプローチです)。

于 2012-05-25T12:23:43.590 に答える