1

私は十分な休憩を取っていないと思います、そして私の目はコンピュータにいるためにちょっと緊張しています。できる限り20分ルールをやろうとしていますが、ゾーンに入ると忘れがちです。

20分後(カウントダウンの10秒前かもしれません)に画面を閉じたり、空白にしたり、休憩を強制したりする簡単なアプリ(存在する場合はそれを教えてください)を作成したいと思います。

C#がこのようなAPIへのアクセス権を持っているかどうか、またそれがコンソールアプリなのかwpfアプリなのか、それとも何なのかわからない。起動時に起動する必要があり、おそらくタスクバーに表示されます。

助言がありますか?

編集

それが広すぎる場合は、ここが私が求めているものです

  1. C#はX分後に画面を空白にすることができますか?その後、X秒後に通常に戻ります。
  2. このような時限タスクを実行するには、GUIを使用して何かを使用するか、コンソールアプリを使用することをお勧めします(これをできるだけ早く起動しようとします)
4

4 に答える 4

7

オン/オフにするには、次のクラスを使用できます。

  public static class MonitorHelper
    {
        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);

        public static void TurnOn()
        {
            SendMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);
        }

        public static void TurnOff()
        {
            SendMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
        }

        const int SC_MONITORPOWER = 0xF170;
        const int WM_SYSCOMMAND = 0x0112;
        const int MONITOR_ON = -1;
        const int MONITOR_OFF = 2;     
    }

MonitorHelperクラスの使用法:

class Program
{
    static void Main(string[] args)
    {
        MonitorHelper.TurnOff();
        Thread.Sleep(TimeSpan.FromSeconds(2));
        MonitorHelper.TurnOn();
    }
}

モニターのオン/オフを切り替えてタスクをスケジュールする場合は、Quartz.NETを使用できます。

Quartz.NETの例:

ジョブクラス:

class MonitorJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        MonitorHelper.TurnOff();
        Thread.Sleep(TimeSpan.FromSeconds(2));
        MonitorHelper.TurnOn();
    }
}

構成コード:

ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = schedFact.GetScheduler();

IJobDetail job = JobBuilder.Create<MonitorJob>()
 .WithIdentity("monitorJob", "group")
 .Build();

ITrigger trigger = TriggerBuilder.Create()
  .WithIdentity("monitorTrigger", "group")            
  .StartNow()
  .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever())
  .Build();

sched.ScheduleJob(job, trigger);

sched.Start();

PostMessageを使用したMonitorHelperクラス:

class MonitorHelperEx
{
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    public static void TurnOn()
    {
        PostMessageSafe(new IntPtr(-1), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);
    }

    public static void TurnOff()
    {
        PostMessageSafe(new IntPtr(-1), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
    }

    static void PostMessageSafe(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
    {
        bool returnValue = PostMessage(hWnd, msg, wParam, lParam);
        if (!returnValue)
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
    }

    static readonly IntPtr SC_MONITORPOWER = new IntPtr(0xF170);
    static readonly uint WM_SYSCOMMAND = 0x0112;
    static readonly IntPtr MONITOR_ON = new IntPtr(-1);
    static readonly IntPtr MONITOR_OFF = new IntPtr(2);     
}
于 2013-02-18T19:00:22.267 に答える
3

WPFアプリケーションとQuartz.NETを使用できます。

この場合、時計などのカスタムコンテンツをウィンドウに追加でき、画面がブロックされるときに表示されます。

MainWindow.xaml:

<Window x:Class="WPFBlankScreen.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"   
        WindowState="Minimized"
        Background="Orange" 
        KeyDown="Window_KeyDown"
        >
    <Grid>        
    </Grid>
</Window>

コードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Init();
    }

    private void Init()
    {
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        IScheduler sched = schedFact.GetScheduler();

        IDictionary<string, object> map = new Dictionary<string, object>();
        map.Add("window", this);

        IJobDetail job = JobBuilder.Create<ShowJob>()
         .WithIdentity("showJob", "group")             
         .UsingJobData(new JobDataMap(map))
         .Build();

        ITrigger trigger = TriggerBuilder.Create()
          .WithIdentity("showTrigger", "group")
          .StartNow()
          .WithSimpleSchedule(x => x.WithIntervalInMinutes(1).RepeatForever())
          .Build();

        sched.ScheduleJob(job, trigger);
        sched.Start();
    }

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.F11)
        {               
            this.Hide();
        }
    }
}

ShowJobクラス:

class ShowJob: IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Window win = context.JobDetail.JobDataMap.Get("window") as Window;
        if (win != null)
        {
            Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                win.Width = System.Windows.SystemParameters.FullPrimaryScreenWidth;
                win.Height = System.Windows.SystemParameters.FullPrimaryScreenHeight;
                win.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                win.WindowStyle = WindowStyle.None;
                win.Topmost = true;
                win.WindowState = WindowState.Maximized;
                win.Show();
            }));

            IDictionary<string, object> map = new Dictionary<string, object>();
            map.Add("window", win);

            IJobDetail job = JobBuilder.Create<HideJob>()
             .WithIdentity("hideJob", "group")
             .UsingJobData(new JobDataMap(map))
             .Build();

            ITrigger trigger = TriggerBuilder.Create()
              .WithIdentity("hideTrigger", "group")
              .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Second))
              .Build();

            context.Scheduler.ScheduleJob(job, trigger);
        }
    }
}

HideJobクラス:

class HideJob: IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Window win = context.JobDetail.JobDataMap.Get("window") as Window;          
        if (win != null && Application.Current != null)
        {               
            Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                win.Hide();
            }));
        }            
    }
}
于 2013-02-20T21:02:25.517 に答える
1

私の答えは派手ではないかもしれませんが、それは非常に単純で、機能します:

新しいWinformsプロジェクトでは、次のようにします。
-FormBorderStyle =Noneを設定します-BackColor=
Red(または任意の値)を
設定します-TopMost=Trueを設定します-WindowState
=Maximizedを設定します-
フォームにタイマーをドロップします
-タイマー間隔を2000に設定します
- Set timer Enabled =
true-タイマーをダブルクリックしてClose();と書き込みます。イベントハンドラーで。

終了した!

編集; これにより、1つの画面が2秒間真っ赤になりますが、これに気付く必要があります。

于 2013-02-26T12:18:18.610 に答える
0

これが画面をオフにする方法です

using System.Runtime.InteropServices; //to DllImport

 public int WM_SYSCOMMAND = 0x0112;
 public int SC_MONITORPOWER = 0xF170; //Using the system pre-defined MSDN constants    
 that    can be used by the SendMessage() function .
 [DllImport("user32.dll")]
 private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
//To call a DLL function from C#, you must provide this declaration .


  private void button1_Click(object sender, System.EventArgs e)
  {

   SendMessage( this.Handle.ToInt32() , WM_SYSCOMMAND , SC_MONITORPOWER ,2 );//DLL    
   function
   }
于 2013-02-26T10:29:25.687 に答える