}
internal override void RaiseIdle (EventArgs e)
- {
- if (Idle != null)
- Idle (this, e);
+ {
+ int id = Thread.CurrentThread.ManagedThreadId;
+ if (Idle_Threads != null &&
+ Idle_Threads.ContainsKey (id) &&
+ Idle_Threads [id] != null)
+ {
+ Idle_Threads [id] (this, e);
+ }
}
internal override Keys ModifierKeys {
private bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, bool blocking) {
bool result;
+ bool CheckIdle = blocking;
+
+ ProcessNextMessage:
msg.refobject = 0;
if (RetrieveMessage(ref msg)) {
return true;
}
- if (blocking) {
+ if (blocking && !CheckIdle) {
result = Win32GetMessage(ref msg, hWnd, wFilterMin, wFilterMax);
} else {
result = Win32PeekMessage(ref msg, hWnd, wFilterMin, wFilterMax, (uint)PeekMessageFlags.PM_REMOVE);
if (!result) {
- return false;
+ if (CheckIdle) {
+ RaiseIdle (null);
+ CheckIdle = false;
+ goto ProcessNextMessage;
+ } else {
+ return false;
+ }
}
}
Win32SetForegroundWindow(handle);
}
- internal override event EventHandler Idle;
#endregion // Public Static Methods
#region Win32 Imports