1

そのため、Twitch.tv API から json 文字列をロードするフォーム コンストラクターに無限ループがあります。ただし、このアプリケーションはタスクバーから実行されます。そのため、ユーザーが F1 キーを押したときにメッセージ ボックスが表示されるように、グローバル ホットキーを設定しました。私が直面している問題は、ループ中にキープレスを検出しようとしていることです。ループする必要があるのは、twitch ストリーマーがいつオンラインまたはオフラインになったかを知る必要があるためです。Windows サービスを実行しようとしたので、無限ループを実行する必要はありませんが、サービスでキーの押下を検出できません。ループを取り除くのが最善の方法であることはわかっていますが、その方法がわかりません。これがコードです。

 private KeyHandler ghk;
    private System.Timers.Timer liveTime = new System.Timers.Timer();
    UserInfo info;

    public Form1()
    {
        InitializeComponent();
        ghk = new KeyHandler(Keys.F1, this);
        ghk.Register();

        while (true)
        {
            using (var webClient = new System.Net.WebClient())
            {
                var json = webClient.DownloadString("https://api.twitch.tv/kraken/streams/lirik");
                // Now parse with JSON.Net
                info = new UserInfo(json);
            }

            info.streamLive();

            if (info.streamLive() && !liveTime.Enabled)
            {
                liveTime.Start();
            }

            if (!info.streamLive())
            {
                liveTime.Stop();
            }
        }
    }

    private void HandleHotkey()
    {
        MessageBox.Show("hello");
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Constants.WM_HOTKEY_MSG_ID)
            HandleHotkey();
        base.WndProc(ref m);
    }
}
4

1 に答える 1

2

最も簡単な回避策は、別のスレッドで無限ループを実行して、メイン スレッドをブロックしないようにすることです。これにより、イベントを受信して​​処理できるようになります。次のようになります。

new Thread(delegate() { 

while(true)
{
 //...
}

}).Start();
于 2014-09-10T22:52:47.980 に答える