2013-02-18 5 views
1

Не думаю, что у меня хватит перерывов, и мои глаза напряжены для того, чтобы быть на компьютере. Я стараюсь сделать правило 20min настолько, насколько могу, но как только я попаду в зону, я, как правило, забываю это сделать.Пустой экран после X минут

Я хочу, чтобы быстро открыть приложение (если есть, пожалуйста, укажите мне), что через 20 минут (может быть, за 10 секунд до обратного отсчета), которые будут закрыты на экране или забыли это или что-то, что вынудит меня принять ломать.

Не уверен, что C# имеет доступ к apis к чему-то подобному и не уверен, что это должно быть консольное приложение или приложение wpf или что. Это нужно будет запускать при запуске и, вероятно, жить в панели задач.

Любые предложения?

Редактировать

Если он слишком широк, вот что я после

  1. Может C# пустой экран после X минут? Затем после X секунд вернитесь к нормальному состоянию.
  2. Чтобы сделать приуроченную задачу, как это лучше использовать что-то с графического интерфейса или я мог получить путь с консольным приложением (пытается получить это в качестве как можно быстрее)
+0

Этот вопрос слишком широк для SO. Кроме того, это довольно плохая идея разбить вашу концентрацию каждые 20 минут. Это повредит как вашей эффективности, так и увлекательной работе. –

+0

Ну, конечно, это отстой, чтобы сломать вам концентрацию, но это еще больше, если вы испортите свои глаза и свое здоровье. Если это становится проблемой, я всегда могу усовершенствовать свою идею и исправить ее. Легче исправить свое здоровье. – chobo2

+0

Согласен ... требуется 20 минут, чтобы попасть в «зону». Затем, как только вы нарушите эту концентрацию, вы в 20 минутах от оптимальной производительности. – Eric

ответ

3

Вы можете использовать WPF аппликаций n и 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> 

Code-за:

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(); 
      })); 
     }    
    } 
} 
+0

Хорошо. Я попробую и посмотрю, работает ли оно лучше. Может ли он быть принудительно разблокирован, если необходимо? – chobo2

+0

@ chobo2 да можно. Я добавил код к своему ответу, что при нажатии клавиши F11 ключевое окно будет немедленно скрываться. – kmatyaszek

6

Чтобы включить/выкл вы можете использовать следующий класс:

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(); 

MonitorHelper класс с PostMessage:

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);  
} 
+0

Хорошая идея даже не думала использовать кварц. – chobo2

+0

@ chobo2 Quartz.NET очень хорош для задачи расписания, снова проверьте мой ответ, я добавил пример кода. – kmatyaszek

+0

Ya. Я использовал его раньше. Это здорово. Лучше, чем мой первоначальный план использования таймеров. – chobo2

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 
    } 
1

Мой ответ не может быть фантазии, но это очень просто, и это работает:

В новом Winforms-проект, сделать это:
- Set FormBorderStyle = None
- Set BackColor = красный (или что вы хотите)
- Набор TopMost = True
- Набор WindowState = максимизируется
- Бросьте таймер на форме
- Установить интервал таймера 2000
- Установите таймер Enabled = правда
- таймер Doubleclick и написать Close(); в обработчике событий.

Закончено!

Редактировать; Это только делает ОДИН экран ярко-красным в течение двух секунд, но вы ДОЛЖНЫ это заметить ....

Смежные вопросы