У меня есть таймер бездействия, который продолжает проверять бездействие на протяжении всего приложения. Проблема заключается в том, что когда ящик сообщений открыт, таймер не тикает и не проверяет бездействие, пока 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
C# Таймер не тикает, когда открыто окно сообщений ⇐ C#
Место общения программистов C#
-
Anonymous
1739968954
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 открыт, он не проверяет бездействие. Пожалуйста, помогите.
Подробнее здесь: [url]https://stackoverflow.com/questions/79451370/c-sharp-timer-is-not-ticking-when-message-box-is-open[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия