40

わかった。これはちょっとした虚栄心アプリですが、今日、職場でトレーニング クラスに参加していて、マシンが 10 分ごとにロックされるように設定されている状況がありました。まあ、トレーナーがスライドを変えるのではなく、話すことに興奮した場合、マシンはロックされます.

マウスを 4 分ごとに 1 ピクセルずつ移動するだけのタスクバー アイコンしかない小さなアプリを書きたいと思います。

私は Delphi (私の強力な言語) を使用して 3 つの方法でそれを行うことができますが、仕事のために C# に移行しており、そこで最も抵抗の少ない方法を知りたいと考えています。

4

6 に答える 6

26

C# 3.5 の場合

通知アイコンがないため、タスクマネージャーでこのアプリケーションを手動で終了する必要があります

using System;
using System.Drawing;
using System.Windows.Forms;

static class Program
{
    static void Main()
    {
        Timer timer = new Timer();
        // timer.Interval = 4 minutes
        timer.Interval = (int)(TimeSpan.TicksPerMinute * 4 / TimeSpan.TicksPerMillisecond);
        timer.Tick += (sender, args) => { Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y + 1); };
        timer.Start();
        Application.Run();
    }
}
于 2008-08-05T03:00:24.750 に答える
12

これを行う「正しい」方法は、WM_SYSCOMMANDメッセージに応答することです。C#では、これは次のようになります。

protected override void WndProc(ref Message m)
{
    // Abort screensaver and monitor power-down
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MONITOR_POWER = 0xF170;
    const int SC_SCREENSAVE = 0xF140;
    int WParam = (m.WParam.ToInt32() & 0xFFF0);

    if (m.Msg == WM_SYSCOMMAND &&
        (WParam == SC_MONITOR_POWER || WParam == SC_SCREENSAVE)) return;

    base.WndProc(ref m);
}

MSDNによると、Vista以降のポリシーでスクリーンセーバーのパスワードが有効になっている場合、これは機能しません。私はこれをテストしていませんが、おそらくプログラムでマウスを動かすことも無視されます。

于 2008-08-17T20:29:35.697 に答える
10

自宅で仕事をするときは、マウスのコードをデスクトップの扇風機に結び付けて左右に振動させます。マウスを動かし続け、ワークステーションがスリープ状態にならないようにします。

于 2011-12-09T20:29:23.743 に答える
3

このようなものは機能するはずです (ただし、間隔を変更する必要があります)

public Form1()
{
    InitializeComponent();
    Timer Every4Minutes = new Timer();
    Every4Minutes.Interval = 10;
    Every4Minutes.Tick += new EventHandler(MoveNow);
    Every4Minutes.Start();
}

void MoveNow(object sender, EventArgs e)
{
    Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y - 1);
}
于 2008-08-05T03:07:41.523 に答える
1

(Windows 10 / .Net 5 / C# 9.0)

アクティビティを偽造する代わりに、

システムが使用中であることをシステムに通知し、アプリケーションの実行中にシステムがスリープ状態になったり、ディスプレイがオフになったりするのを防ぎます。

PInvoke.netで説明されているように、SetThreadExecutionStateを使用します。

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace VanityApp
{
    internal static class Program
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern ExecutionState SetThreadExecutionState(ExecutionState esFlags);

        [Flags]
        private enum ExecutionState : uint
        {
            ES_AWAYMODE_REQUIRED = 0x00000040,
            ES_CONTINUOUS = 0x80000000,
            ES_DISPLAY_REQUIRED = 0x00000002,
            ES_SYSTEM_REQUIRED = 0x00000001
        }

        private static void Main()
        {
            using AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            using Timer timer = new Timer(state => SetThreadExecutionState(ExecutionState.ES_AWAYMODE_REQUIRED | ExecutionState.ES_CONTINUOUS | ExecutionState.ES_DISPLAY_REQUIRED | ExecutionState.ES_SYSTEM_REQUIRED), autoResetEvent, 0, -1);
            autoResetEvent.WaitOne();
        }
    }
}

Timer は、便利なコンストラクターを備えたSystem.Threading.Timerであり、 AutoResetEvent.WaitOne()を使用してすぐに終了することを回避します。

于 2020-12-15T19:46:57.613 に答える