Создайте фоновый процесс в окнах без видимой консоли

JxBrowser еще не упоминается. Он включает Mozilla Firefox (Gecko), Apple Safari (WebKit) или Internet Explorer. Руководство для программистов

6
задан Andre 23 August 2016 в 20:15
поделиться

4 ответа

Необходимо действительно сказать нам, как Вы пытаетесь сделать это в настоящее время, но в моей системе (использующий Linux) следующий отрывок выполнит команду, не открывая новое окно терминала. Это должно работать тот же путь над окнами.

module Main where
import System
import System.Process
import Control.Monad

main :: IO ()
main = do
  putStrLn "Running command..."
  pid <- runCommand "mplayer song.mp3" -- or whatever you want
  replicateM_ 10 $ putStrLn "Doing other stuff"
  waitForProcess pid >>= exitWith
5
ответ дан 10 December 2019 в 02:56
поделиться

Спасибо за ответы до сих пор, но я нашел свое собственное решение. Я действительно пробовал много разных вещей от записи, что vbs сценарий, как предложено автономной программе, названной hstart. hstart, работал..., но это создает отдельный процесс, который я не любил очень, потому что затем я не могу уничтожить его нормальным способом. Но я нашел простое решение, которое потребовало просто кода Haskell.

Мой код до был простым вызовом к runCommand, который действительно открывал окно. Альтернативная функция, которую можно использовать, является runProcess, который имеет больше опций. От заглядывания на ghc файл исходного кода runProcess.c, я нашел, что флаг CREATE_NO_WINDOW установлен при предоставлении перенаправлений для всех STDIN, КРЕПКИХ, и STDERR. Таким образом, это - то, что необходимо сделать, перенаправления предоставления для тех. Моя тестовая программа похожа:

import System.Process
import System.IO
main = do
  inH <- openFile "in" ReadMode
  outH <- openFile "out" WriteMode
  runProcess "rsync.bat" [] Nothing Nothing (Just inH) (Just outH) (Just outH)

Это работало! Никакое командное окно снова! Протест состоит в том, что Вам нужен пустой файл для inH для чтения в как STDIN eventhough в моей ситуации, это было не нужно.

4
ответ дан 10 December 2019 в 02:56
поделиться

Я ничего не знаю о Haskell, но у меня была эта проблема в проекте C несколько месяцев назад.

Лучший способ выполнить внешнюю программу без любого появления окон состоит в том, чтобы использовать ShellExecuteEx () API-функция с "открытым" глаголом. Если ShellExecuteEx () доступен Вам в Haskell, то необходимо смочь достигнуть того, что Вы хотите.

Код C выглядит примерно так:

SHELLEXECUTEINFO Info;
BOOL b;

// Execute it
memset (&Info, 0, sizeof (Info));
Info.cbSize = sizeof (Info);
Info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
Info.hwnd = NULL;
Info.lpVerb = "open";
Info.lpFile = "rsync.exe";
Info.lpParameters = "whatever parameters you like";
Info.lpDirectory = NULL;
Info.nShow = SW_HIDE;
b = ShellExecuteEx (&Info);
if (b)
   {
   // Looks good; if there is an instance, wait for it
   if (Info.hProcess)
      {
      // Wait
      WaitForSingleObject (Info.hProcess, INFINITE);
      }
   }
0
ответ дан 10 December 2019 в 02:56
поделиться

Самым простым путем я могу думать, должен выполнить команду rsync из Windows Shell script (vbs или cmd).

0
ответ дан 10 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: