C# Таймер не тикает, когда открыто окно сообщенийC#

Место общения программистов C#
Ответить
Anonymous
 C# Таймер не тикает, когда открыто окно сообщений

Сообщение Anonymous »

У меня есть таймер бездействия, который продолжает проверять бездействие на протяжении всего приложения. Проблема заключается в том, что когда ящик сообщений открыт, таймер не тикает и не проверяет бездействие, пока Bessagebox остается открытым. Когда он закрыт, он работает нормально.public class UIInactivity
{
public static Timer IdleTimer;
private readonly int _timeoutDuration;
private InactivityState _inactivityState;
public event Action NotifyInActivity;

public UIInactivity(int timeoutDurationInMinutes, InactivityState inactivityState)
{
_timeoutDuration = (int)TimeSpan.FromMinutes(timeoutDurationInMinutes).TotalMilliseconds;
_inactivityState = inactivityState;
InitInactivity();
}

private void InitInactivity()
{
//Application.EnableVisualStyles(); //Uncomment this line for new look and feel.
IdleTimer = new Timer();
LeaveIdleMessageFilter limf = new LeaveIdleMessageFilter();
Application.AddMessageFilter(limf);
IdleTimer.Interval = _timeoutDuration;
IdleTimer.Tick += TimeDone;
IdleTimer.Enabled = false;
}

private void Application_Idle(object sender, EventArgs e)
{
if (!IdleTimer.Enabled)
{
IdleTimer.Start();
}
}

private void TimeDone(object sender, EventArgs e)
{
StopTimer();
NotifyInActivity?.Invoke(_inactivityState);
}

public void StopTimer()
{
IdleTimer.Stop();
IdleTimer.Enabled = false;
Application.Idle -= new EventHandler(Application_Idle);
}

public void StartTimer(int minutes)
{
if (IdleTimer != null && !IdleTimer.Enabled)
{
if (minutes > 0)
{
IdleTimer.Interval = (int)TimeSpan.FromMinutes(minutes).TotalMilliseconds;
}
else
{
throw new Exception("Inavlid timeout duration for Activity Logger");
}
IdleTimer.Enabled = true;
IdleTimer.Start();
Application.Idle += new EventHandler(Application_Idle);
}
}
}

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public class LeaveIdleMessageFilter : IMessageFilter
{
const int WM_NCLBUTTONDOWN = 0x00A1;
const int WM_NCLBUTTONUP = 0x00A2;
const int WM_NCRBUTTONDOWN = 0x00A4;
const int WM_NCRBUTTONUP = 0x00A5;
const int WM_NCMBUTTONDOWN = 0x00A7;
const int WM_NCMBUTTONUP = 0x00A8;
const int WM_NCXBUTTONDOWN = 0x00AB;
const int WM_NCXBUTTONUP = 0x00AC;
const int WM_KEYDOWN = 0x0100;
const int WM_KEYUP = 0x0101;
const int WM_MOUSEMOVE = 0x0200;
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;
const int WM_RBUTTONDOWN = 0x0204;
const int WM_RBUTTONUP = 0x0205;
const int WM_MBUTTONDOWN = 0x0207;
const int WM_MBUTTONUP = 0x0208;
const int WM_XBUTTONDOWN = 0x020B;
const int WM_XBUTTONUP = 0x020C;

// The Messages array must be sorted due to use of Array.BinarySearch
static int[] Messages = new int[] {WM_NCLBUTTONDOWN,
WM_NCLBUTTONUP, WM_NCRBUTTONDOWN, WM_NCRBUTTONUP, WM_NCMBUTTONDOWN,
WM_NCMBUTTONUP, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, WM_KEYDOWN, WM_KEYUP,
WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP,
WM_MBUTTONDOWN, WM_MBUTTONUP, WM_XBUTTONDOWN, WM_XBUTTONUP};

public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_MOUSEMOVE) // mouse move is high volume
return false;
if (!UIInactivity.IdleTimer.Enabled) // idling?
return false; // No
if (Array.BinarySearch(Messages, m.Msg) >= 0)
UIInactivity.IdleTimer.Stop();
return false;
}
}
< /code>
Где -то в приложении форма открывает предупреждающий Bessagebox следующим образом при попытке сохранить изменения, < /p>
if (DialogResult.Yes == MessageBox.Show(m_ResMngr.GetString("ChanRangeWarn"),m_ResMngr.GetString("Warning"),MessageBoxButtons.YesNo,MessageBoxIcon.Warning))
{
//Something
}
< /code>
Когда этот Bessagebox открыт, он не проверяет бездействие. Пожалуйста, помогите.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ox-is-open
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»