0

無限ループで実行されている小さなアプリケーションがあり、ディレクトリを監視し、その中にファイルがある場合は出力します。これをシステム トレイで実行したいのですが、右マウスでアイコンをクリックしても何も起こりませんが、ターゲット ディレクトリにファイルがあり、コンピューターが印刷を開始すると、メニューが表示されます。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
using System.Collections.Generic;
using System.IO;
using System.Drawing.Printing;
using System.Text;

namespace CreativeGastPrint
{
    public class SysTrayApp : Form
    {
        [STAThread]
        public static void Main()
        {
            Application.Run(new SysTrayApp());
        }

        private NotifyIcon trayIcon;
        private ContextMenu trayMenu;

        public SysTrayApp()
        {
            trayMenu = new ContextMenu();
            trayMenu.MenuItems.Add("Exit", OnExit);

            trayIcon = new NotifyIcon();
            trayIcon.Text = "PrintApp";
            trayIcon.Icon = new Icon("cg.ico");

            trayIcon.ContextMenu = trayMenu;
            trayIcon.Visible = true;

            FileHandler handler = new FileHandler("C:\\print");
            Stopwatch stopwatch = Stopwatch.StartNew();

            while (true)
            {
                try
                {
                    handler.FullDirList();
                    handler.FullContent();
                    List<FileInfo> temp = new List<FileInfo>();

                    foreach (FileInfo f in handler.Files)
                    {
                        temp.Add(f);
                    }

                    foreach (FileInfo f in temp)
                    {
                        DirectoryInfo d = f.Directory;
                        String content = System.IO.File.ReadAllText(f.FullName, Encoding.UTF8);
                        Printer printer = new Printer(content);
                        printer.PrintController = new StandardPrintController();

                        List<String> installed = new List<String>();

                        for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
                        {
                            installed.Add(PrinterSettings.InstalledPrinters[i]);
                        }

                        if (installed.Contains(d.Name))
                        {
                            printer.PrinterSettings.PrinterName = d.Name;
                        }

                        printer.Print();
                    }

                    handler.DeleteFiles();

                    System.Threading.Thread.Sleep(2000);
                    stopwatch.Stop();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: " + e.Message);
                }
            }
        }

        protected override void OnLoad(EventArgs e)
        {
            Visible = false; // Hide form window.
            ShowInTaskbar = false; // Remove from taskbar.

            base.OnLoad(e);
        }

        private void OnExit(object sender, EventArgs e)
        {
            Application.Exit();
        }

        protected override void Dispose(bool isDisposing)
        {
            if (isDisposing)
            {
                // Release the icon resource.
                trayIcon.Dispose();
            }

            base.Dispose(isDisposing);
        }
    }
}
4

1 に答える 1

2

無限ループで実行されている小さなアプリケーション

それがあなたの問題ですwhile(true) { ... }。ループは Windows メッセージの処理をブロックします。そして、それはあなたのアプリを盲目で耳が聞こえないものにします。

非常に手っ取り早い修正方法はApplication.DoEvents()、 の後に呼び出しを追加することSleep()ですが、これは正しい方法ではありません。ループOnExit()がまだ実行されている間に発生する可能性があります...

Windows はイベント駆動型の OS であるため、イベント駆動型のソリューションを記述します。Sleep()またはを使用せずDoEvents()に。

あなたの場合、おそらく Timer を使用し、おそらく BackgroundWorker またはその他の Thread ソリューションを使用する必要があります。

于 2013-07-07T22:13:24.153 に答える