internal WindowChangedEventArgs(IntPtr windowHandle, WinEventHook.WinEvent winEvent) { WindowHandle = windowHandle; switch (winEvent) { case WinEventHook.WinEvent.EVENT_OBJECT_CREATE: Type = ChangeType.Create; break; case WinEventHook.WinEvent.EVENT_OBJECT_DESTROY: Type = ChangeType.Destroy; break; case WinEventHook.WinEvent.EVENT_OBJECT_SHOW: Type = ChangeType.Show; break; case WinEventHook.WinEvent.EVENT_OBJECT_HIDE: Type = ChangeType.Hide; break; case WinEventHook.WinEvent.EVENT_OBJECT_FOCUS: Type = ChangeType.Focus; break; case WinEventHook.WinEvent.EVENT_OBJECT_LOCATIONCHANGE: Type = ChangeType.LocationChange; break; default: throw new ArgumentException("Unexpected WinEvent type", nameof(winEvent)); } }
internal static bool IsSupportedWinEvent(WinEventHook.WinEvent winEvent) { return(winEvent == WinEventHook.WinEvent.EVENT_OBJECT_CREATE || winEvent == WinEventHook.WinEvent.EVENT_OBJECT_DESTROY || winEvent == WinEventHook.WinEvent.EVENT_OBJECT_SHOW || winEvent == WinEventHook.WinEvent.EVENT_OBJECT_HIDE || winEvent == WinEventHook.WinEvent.EVENT_OBJECT_FOCUS || winEvent == WinEventHook.WinEvent.EVENT_OBJECT_LOCATIONCHANGE); // Only for the on-demand hook }
internal WindowChangedEventArgs(IntPtr windowHandle, WinEventHook.WinEvent winEvent, WinEventHook.WinEventObjectId objectId) { WindowHandle = windowHandle; switch (winEvent) { case WinEventHook.WinEvent.EVENT_OBJECT_CREATE: Type = ChangeType.Create; break; case WinEventHook.WinEvent.EVENT_OBJECT_DESTROY: Type = ChangeType.Destroy; break; case WinEventHook.WinEvent.EVENT_OBJECT_SHOW: Type = ChangeType.Show; break; case WinEventHook.WinEvent.EVENT_OBJECT_HIDE: Type = ChangeType.Hide; break; case WinEventHook.WinEvent.EVENT_OBJECT_FOCUS: Type = ChangeType.Focus; break; case WinEventHook.WinEvent.EVENT_OBJECT_LOCATIONCHANGE: Type = ChangeType.LocationChange; break; default: // throw new ArgumentException("Unexpected WinEvent type", nameof(winEvent)); break; } switch (objectId) { case WinEventHook.WinEventObjectId.OBJID_SELF: ObjectId = ChangeObjectId.Self; break; case WinEventHook.WinEventObjectId.OBJID_CLIENT: ObjectId = ChangeObjectId.Client; break; case WinEventHook.WinEventObjectId.OBJID_CARET: ObjectId = ChangeObjectId.Caret; break; default: //Debug.Fail("Unexpected ObjectId"); ObjectId = ChangeObjectId.Unknown; break; } }
void WindowStateChange(IntPtr hWinEventHook, WinEventHook.WinEvent eventType, IntPtr hWnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) { // This runs on the main application thread. Debug.Print("### Thread receiving WindowStateChange: " + Thread.CurrentThread.ManagedThreadId); switch (Win32Helper.GetClassName(hWnd)) { case _classMain: //if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_FOCUS || // eventType == WinEventHook.WinEvent.EVENT_OBJECT_SHOW) { Debug.Print("MainWindow update: " + hWnd.ToString("X") + ", EventType: " + eventType); UpdateMainWindow(hWnd); } if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_DESTROY) { } break; case _classPopupList: if (PopupListWindow == IntPtr.Zero && (eventType == WinEventHook.WinEvent.EVENT_OBJECT_CREATE || eventType == WinEventHook.WinEvent.EVENT_OBJECT_SHOW)) { PopupListWindow = hWnd; PopupListWindowChanged(this, EventArgs.Empty); } else { Debug.Assert(PopupListWindow == hWnd); } break; case _classInCellEdit: Debug.Print("InCell Window update: " + hWnd.ToString("X") + ", EventType: " + eventType + ", idChild: " + idChild); if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_CREATE || eventType == WinEventHook.WinEvent.EVENT_OBJECT_SHOW) { InCellEditWindow = hWnd; InCellEditWindowChanged(this, EventArgs.Empty); } else if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_HIDE) { InCellEditWindow = IntPtr.Zero; InCellEditWindowChanged(this, EventArgs.Empty); } else if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_FOCUS) { InCellEditFocused(this, EventArgs.Empty); } break; case _classFormulaBar: Debug.Print("FormulaBar Window update: " + hWnd.ToString("X") + ", EventType: " + eventType + ", idChild: " + idChild); if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_CREATE || eventType == WinEventHook.WinEvent.EVENT_OBJECT_SHOW) { FormulaBarWindow = hWnd; FormulaBarWindowChanged(this, EventArgs.Empty); } else if (eventType == WinEventHook.WinEvent.EVENT_OBJECT_FOCUS) { FormulaBarFocused(this, EventArgs.Empty); } break; default: //InCellEditWindowChanged(this, EventArgs.Empty); break; } }