/// <summary> /// Adds a selected handler to the control /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void AddGenericWalkerSelectedHandler(Message *ptrMessage) { m_GenericWalkerControl = GetObjectFromDatastore(ptrMessage->SourceStore); m_GenericWalkerParent = GetParameterIntPtr(ptrMessage, 0); m_GenericWalkerSelected = false; if (m_GenericWalkerControl != null) { if (m_GenericWalkerSelectedHandler == null) { MethodInfo genericWalkerSelectedMethodInfo = this.GetType().GetMethod("GenericWalkerSelectedHandler", BindingFlags.NonPublic | BindingFlags.Instance); if (genericWalkerSelectedMethodInfo == null) { throw new Exception("Failed to find method GenericWalkerSelectedHandler"); } m_GenericWalkerSelectedEventInfo = m_GenericWalkerControl.GetType().GetEvent("Selected"); if (m_GenericWalkerSelectedEventInfo == null) { throw new Exception("Failed to find event Selected"); } m_GenericWalkerSelectedHandler = Delegate.CreateDelegate(m_GenericWalkerSelectedEventInfo.EventHandlerType, this, genericWalkerSelectedMethodInfo); } m_GenericWalkerSelectedEventInfo.AddEventHandler(m_GenericWalkerControl, m_GenericWalkerSelectedHandler); } CleanUpMessage(ptrMessage); }
private unsafe void DumpActiveX(Message *ptrMessage, int messageNumber) { //must be first message if (messageNumber != 1) { throw new Exception("DumpActiveX must be first message"); } CleanUpMessage(ptrMessage); StringBuilder dump = new StringBuilder(); if (Ax.Items.Count > 0) { lock (Ax.AxItemsLock) { int items = Ax.Items.Count; for (int item = 0; item < items; item++) { dump.Append("Name: " + Ax.Items[item].Name); dump.Append(" TypeName: " + Ax.Items[item].TypeName); dump.Append(" TypeNameSpace: " + Ax.Items[item].TypeNameSpace); dump.Append(" UniqueId: " + Ax.Items[item].UniqueId); dump.Append(" Handle: " + Ax.Items[item].Handle.ToString()); dump.Append(" Parent: " + Ax.Items[item].ParentHandle.ToString()); dump.Append(" ContainerUniqueId: " + Ax.Items[item].ContainerUniqueId); dump.Append(" Rendered: " + Ax.Items[item].Rendered.ToString()); dump.AppendLine(); } } } AddReturnValue(new Parameter(this, dump.ToString())); }
private unsafe void GetComboBoxExItemText(Message *ptrMessage, int messageNumber) { //must be first message if (messageNumber != 1) { throw new Exception("GetComboBoxExItemText must be first message"); } IntPtr handle = GetParameterIntPtr(ptrMessage, 0); int index = GetParameterInt32(ptrMessage, 1); string description = GetParameterString(ptrMessage, 2); CleanUpMessage(ptrMessage); IntPtr sendResult; IntPtr messageResult; //Work out if the control is unicode or not bool ASCII = false; sendResult = NM.SendMessageTimeout(handle, NM.CBEM_GETUNICODEFORMAT, IntPtr.Zero, IntPtr.Zero, NM.SendMessageTimeoutFlags.SMTO_NORMAL, this.TimeOut, out messageResult); if (sendResult == IntPtr.Zero) //Failed { throw new Exception("Failed to get the character format of the " + description); } if (messageResult == IntPtr.Zero) { ASCII = true; } //Get the item text NM.ComboBoxExItem item = new NM.ComboBoxExItem(); item.iItem = new IntPtr(index); item.mask = NM.CBEIF_TEXT; item.pszText = new string(' ', 1001); item.cchTextMax = 1000; if (ASCII) { sendResult = NM.SendMessageTimeout(handle, NM.CBEM_GETITEMA, IntPtr.Zero, ref item, NM.SendMessageTimeoutFlags.SMTO_NORMAL, this.TimeOut, out messageResult); if (sendResult == IntPtr.Zero || messageResult == IntPtr.Zero) //Failed { throw new Exception("Failed to get the text of the item in the " + description); } byte[] bytes = Encoding.Unicode.GetBytes(item.pszText); string ascii = Encoding.ASCII.GetString(bytes); AddReturnValue(new Parameter(this, ascii.Substring(0, ascii.IndexOf('\0')))); } else { sendResult = NM.SendMessageTimeout(handle, NM.CBEM_GETITEMW, IntPtr.Zero, ref item, NM.SendMessageTimeoutFlags.SMTO_NORMAL, this.TimeOut, out messageResult); if (sendResult == IntPtr.Zero || messageResult == IntPtr.Zero) //Failed { throw new Exception("Failed to get the text of the item in the " + description); } AddReturnValue(new Parameter(this, item.pszText.Substring(0, item.pszText.IndexOf('\0')))); } }
public Parameter(APEIPC instance, string param) { Message *PtrMessage = instance.GetPointerToNextMessage(); if (param != null) { int length = param.Length * 2; //UTF16 charcter: For a 4 byte surrogate pair, length actually returns 2 somewhat confusingly although its convenient for us here, so we can just use length * 2 CheckSize(instance, length); fixed(void *PtrString = param) { NM.CopyMemory(instance.m_IntPtrMemoryMappedFileViewStringStore + instance.m_StringStoreOffset, (IntPtr)PtrString, (UIntPtr)(length)); } PtrMessage->Parameter.StringOffset[PtrMessage->NumberOfParameters] = instance.m_StringStoreOffset; PtrMessage->Parameter.StringLength[PtrMessage->NumberOfParameters] = param.Length; instance.m_StringStoreOffset = instance.m_StringStoreOffset + (param.Length * 2); } else { PtrMessage->Parameter.StringOffset[PtrMessage->NumberOfParameters] = -1; PtrMessage->Parameter.StringLength[PtrMessage->NumberOfParameters] = -1; } PtrMessage->Parameter.TypeCode[PtrMessage->NumberOfParameters] = (int)ApeTypeCode.String; PtrMessage->Parameter.ParameterType[PtrMessage->NumberOfParameters] = (int)ParameterType.In; PtrMessage->TypeCodeKey += ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + (int)ApeTypeCode.String) + ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + OneLargerThanApeTypeCodeEnumMax + (int)ParameterType.In); PtrMessage->NumberOfParameters++; }
/// <summary> /// Waits for the handler to set the mouse click variable to true then removes the handler /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void WaitForAndRemoveMouseClickHandler(Message *ptrMessage) { if (m_MouseClickControl != null) { try { Stopwatch timer = Stopwatch.StartNew(); while (true) { if (m_MouseClicked || m_MouseClickControl.Disposing || m_MouseClickControl.IsDisposed) { break; } if (timer.ElapsedMilliseconds > m_TimeOut) { throw new Exception("Failed to detect mouse event"); } Thread.Sleep(15); } } finally { m_MouseClickControl.MouseClick -= m_MouseClick; m_MouseClickControl.MouseUp -= m_MouseClick; m_MouseClickControl.MouseDown -= m_MouseClick; m_MouseClickControl = null; } } CleanUpMessage(ptrMessage); }
/// <summary> /// Adds a selected handler to the control /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void AddToolStripItemEnteredHandler(Message *ptrMessage) { m_ToolStripItemControl = GetObjectFromDatastore(ptrMessage->SourceStore); m_ToolStripControlHandle = GetParameterIntPtr(ptrMessage, 0); m_ToolStripItemEntered = false; if (m_ToolStripItemControl != null) { if (m_ToolStripItemEnteredHandler == null) { MethodInfo toolStripItemEnteredMethodInfo = this.GetType().GetMethod("ToolStripItemEnteredHandler", BindingFlags.NonPublic | BindingFlags.Instance); if (toolStripItemEnteredMethodInfo == null) { throw new Exception("Failed to find method ToolStripItemEnteredHandler"); } m_ToolStripItemEnteredEventInfo = m_ToolStripItemControl.GetType().GetEvent("MouseEnter"); if (m_ToolStripItemEnteredEventInfo == null) { throw new Exception("Failed to find event MouseEnter"); } m_ToolStripItemEnteredHandler = Delegate.CreateDelegate(m_ToolStripItemEnteredEventInfo.EventHandlerType, this, toolStripItemEnteredMethodInfo); } m_ToolStripItemEnteredEventInfo.AddEventHandler(m_ToolStripItemControl, m_ToolStripItemEnteredHandler); } CleanUpMessage(ptrMessage); }
private unsafe void ScrollControlIntoView(Message *ptrMessage, int messageNumber) { //must be first message if (messageNumber != 1) { throw new Exception("ScrollControlIntoView must be first message"); } // p1 = handle IntPtr handle = GetParameterIntPtr(ptrMessage, 0); WF.Control childControl = WF.Control.FromHandle(handle); if (childControl != null) { WF.Control control = childControl.Parent; while (control != null) { if (control.GetType().IsSubclassOf(m_ScrollableControl)) { ((WF.ScrollableControl)control).ScrollControlIntoView(childControl); } control = control.Parent; } } //TODO WPF etc }
/// <summary> /// Gets the parameters from the message then adds a mouse hook to the specified thread /// </summary> /// <param name="ptrMessage">A pointer to the message</param> /// <param name="messageNumber">The message number</param> private unsafe void AddMouseHook(Message *ptrMessage, int messageNumber) { if (messageNumber != 1) { throw new Exception("AddMouseHook must be the first message"); } IntPtr handle = GetParameterIntPtr(ptrMessage, 0); CleanUpMessage(ptrMessage); int threadId = NM.GetWindowThreadProcessId(handle, IntPtr.Zero); m_HookWindow = handle; // Add the mouse hook DebugLogging.WriteLog("Adding Mouse hook"); m_hMouseHook = NM.SetWindowsHookEx(NM.WH_MOUSE, MouseHookProcedure, IntPtr.Zero, threadId); if (m_hMouseHook == 0) { throw new Exception("SetWindowsHookEx failed to add mouse hook"); } DebugLogging.WriteLog("Added Mouse hook"); ClearMouseState(); }
private unsafe void GetTabRect(Message *ptrMessage) { object sourceObject = GetObjectFromDatastore(ptrMessage->SourceStore); CleanUpMessage(ptrMessage); int left = -1; int top = -1; int width = -1; int height = -1; object[] parameters = { left, top, width, height }; ParameterModifier modifiers = new ParameterModifier(4); modifiers[0] = true; modifiers[1] = true; modifiers[2] = true; modifiers[3] = true; ParameterModifier[] modifiersArray = { modifiers }; sourceObject.GetType().InvokeMember("GetPositionPix", BindingFlags.InvokeMethod, null, sourceObject, parameters, modifiersArray, null, null); AddReturnValue(new Parameter(this, (int)parameters[0])); AddReturnValue(new Parameter(this, (int)parameters[1])); AddReturnValue(new Parameter(this, (int)parameters[2])); AddReturnValue(new Parameter(this, (int)parameters[3])); }
/// <summary> /// Resets the message parameters back to a fresh state /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void CleanUpMessage(Message *ptrMessage) { ptrMessage->TypeCodeKey = 0; ptrMessage->NumberOfParameters = 0; ptrMessage->NameOffset = 0; ptrMessage->NameLength = 0; ptrMessage->Action = MessageAction.None; }
/// <summary>To be documented.</summary> public readonly unsafe int GetMessageA(ulong MessageIndex, Message *pMessage, uint *pMessageByteLength) { var @this = (ID3D12InfoQueue *)Unsafe.AsPointer(ref Unsafe.AsRef(in this)); int ret = default; ret = ((delegate * unmanaged[Cdecl] < ID3D12InfoQueue *, ulong, Message *, uint *, int >)LpVtbl[5])(@this, MessageIndex, pMessage, pMessageByteLength); return(ret); }
public static unsafe void AllocateSomeStuffOnStack(int limit) { Message *messages = stackalloc Message[limit]; for (int i = 0; i < limit; i++) { messages[i] = new Message(i); } }
public Parameter(APEIPC instance, DateTime param) { Message *PtrMessage = instance.GetPointerToNextMessage(); PtrMessage->Parameter.DateTimeBinary[PtrMessage->NumberOfParameters] = param.ToBinary(); PtrMessage->Parameter.TypeCode[PtrMessage->NumberOfParameters] = (int)ApeTypeCode.DateTime; PtrMessage->Parameter.ParameterType[PtrMessage->NumberOfParameters] = (int)ParameterType.In; PtrMessage->TypeCodeKey += ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + (int)ApeTypeCode.DateTime) + ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + OneLargerThanApeTypeCodeEnumMax + (int)ParameterType.In); PtrMessage->NumberOfParameters++; }
public Parameter(APEIPC instance, Char param) { Message *PtrMessage = instance.GetPointerToNextMessage(); PtrMessage->Parameter.Char[PtrMessage->NumberOfParameters] = param; PtrMessage->Parameter.TypeCode[PtrMessage->NumberOfParameters] = (int)ApeTypeCode.Char; PtrMessage->Parameter.ParameterType[PtrMessage->NumberOfParameters] = (int)ParameterType.In; PtrMessage->TypeCodeKey += ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + (int)ApeTypeCode.Char) + ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + OneLargerThanApeTypeCodeEnumMax + (int)ParameterType.In); PtrMessage->NumberOfParameters++; }
public Parameter(APEIPC instance, UInt64 param, ParameterType apeParameterType) { Message *PtrMessage = instance.GetPointerToNextMessage(); PtrMessage->Parameter.UInt64[PtrMessage->NumberOfParameters] = param; PtrMessage->Parameter.TypeCode[PtrMessage->NumberOfParameters] = (int)ApeTypeCode.UInt64; PtrMessage->Parameter.ParameterType[PtrMessage->NumberOfParameters] = (int)apeParameterType; PtrMessage->TypeCodeKey += ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + (int)ApeTypeCode.UInt64) + ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + OneLargerThanApeTypeCodeEnumMax + (int)apeParameterType); PtrMessage->NumberOfParameters++; }
public Parameter(APEIPC instance, DataStores param) { Message *PtrMessage = instance.GetPointerToNextMessage(); PtrMessage->Parameter.Int32[PtrMessage->NumberOfParameters] = (Int32)param; PtrMessage->Parameter.TypeCode[PtrMessage->NumberOfParameters] = (int)ApeTypeCode.DataStore; PtrMessage->Parameter.ParameterType[PtrMessage->NumberOfParameters] = (int)ParameterType.In; PtrMessage->TypeCodeKey += ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + (int)ApeTypeCode.DataStore) + ((PtrMessage->NumberOfParameters * OneLargerThanApeTypeCodeEnumMax * 2) + OneLargerThanApeTypeCodeEnumMax + (int)ParameterType.In); PtrMessage->NumberOfParameters++; }
/// <summary> /// Shows a data column / row in the data grid view /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void DataGridViewShowCell(Message *ptrMessage) { object sourceObject = GetObjectFromDatastore(ptrMessage->SourceStore); int rowIndexData = GetParameterInt32(ptrMessage, 0); int columnIndexData = GetParameterInt32(ptrMessage, 1); object[] theParameters = { sourceObject, rowIndexData, columnIndexData }; ((WF.Control)tempStore0).Invoke(DataGridViewShowCellDelegater, theParameters); CleanUpMessage(ptrMessage); }
/// <summary> /// Gets the specified parameter from the message, validating it is the correct type /// </summary> /// <param name="ptrMessage">A pointer to the message</param> /// <param name="parameter">The parameter number (0 based)</param> /// <returns>The value in the mssage for the specified parameter</returns> unsafe private IntPtr GetParameterIntPtr(Message *ptrMessage, int parameter) { if ((ptrMessage->Parameter.TypeCode[parameter]) == (int)ApeTypeCode.IntPtr) { return((IntPtr)(void *)ptrMessage->Parameter.IntPtr[parameter]); } else { throw new Exception("Expected ApeTypeCode.IntPtr got ApeTypeCode." + (ptrMessage->Parameter.TypeCode[parameter]).ToString()); } }
/// <summary> /// Gets the specified parameter from the message, validating it is the correct type /// </summary> /// <param name="ptrMessage">A pointer to the message</param> /// <param name="parameter">The parameter number (0 based)</param> /// <returns>The value in the mssage for the specified parameter</returns> unsafe private bool GetParameterBoolean(Message *ptrMessage, int parameter) { if ((ptrMessage->Parameter.TypeCode[parameter]) == (int)ApeTypeCode.Boolean) { return(ptrMessage->Parameter.Boolean[parameter]); } else { throw new Exception("Expected ApeTypeCode.Boolean got ApeTypeCode." + (ptrMessage->Parameter.TypeCode[parameter]).ToString()); } }
/// <summary> /// Gets the specified parameter from the message, validating it is the correct type /// </summary> /// <param name="ptrMessage">A pointer to the message</param> /// <param name="parameter">The parameter number (0 based)</param> /// <returns>The value in the mssage for the specified parameter</returns> unsafe private int GetParameterInt32(Message *ptrMessage, int parameter) { if ((ptrMessage->Parameter.TypeCode[parameter]) == (int)ApeTypeCode.Int32) { return(ptrMessage->Parameter.Int32[parameter]); } else { throw new Exception("Expected ApeTypeCode.Int32 got ApeTypeCode." + (ptrMessage->Parameter.TypeCode[parameter]).ToString()); } }
/// <summary> /// Gets the specified parameter from the message, validating it is the correct type /// </summary> /// <param name="ptrMessage">A pointer to the message</param> /// <param name="parameter">The parameter number (0 based)</param> /// <returns>The value in the mssage for the specified parameter</returns> unsafe private float GetParameterSingle(Message *ptrMessage, int parameter) { if ((ptrMessage->Parameter.TypeCode[parameter]) == (int)ApeTypeCode.Single) { return(ptrMessage->Parameter.Single[parameter]); } else { throw new Exception("Expected ApeTypeCode.Single got ApeTypeCode." + (ptrMessage->Parameter.TypeCode[parameter]).ToString()); } }
private unsafe void GetInvokeFormActiveX(Message *ptrMessage, int messageNumber) { //must be first message if (messageNumber != 1) { throw new Exception("GetInvokeFormActiveX must be first message"); } PutObjectInDatastore(ptrMessage->DestinationStore, Ax.InvokeForm); CleanUpMessage(ptrMessage); }
/// <summary> /// Removes the handler /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void RemoveGenericWalkerSelectedHandler(Message *ptrMessage) { if (m_GenericWalkerControl != null) { m_GenericWalkerSelectedEventInfo.RemoveEventHandler(m_GenericWalkerControl, m_GenericWalkerSelectedHandler); m_GenericWalkerControl = null; m_GenericWalkerParent = IntPtr.Zero; } CleanUpMessage(ptrMessage); }
/// <summary> /// Removes the handler /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void RemoveMouseClickHandler(Message *ptrMessage) { if (m_MouseClickControl != null) { m_MouseClickControl.MouseClick -= m_MouseClick; m_MouseClickControl.MouseUp -= m_MouseClick; m_MouseClickControl.MouseDown -= m_MouseClick; m_MouseClickControl = null; } CleanUpMessage(ptrMessage); }
unsafe public void AddFirstMessageGetInvokeFormActiveX(DataStores destinationStore) { FirstMessageInitialise(); Message *ptrMessage = GetPointerToNextMessage(); ptrMessage->DestinationStore = destinationStore; ptrMessage->Action = MessageAction.GetInvokeFormActiveX; m_PtrMessageStore->NumberOfMessages++; m_DoneFind = true; }
private unsafe void DumpControl(Message *ptrMessage, int messageNumber) { //must be first message if (messageNumber != 1) { throw new Exception("DumpControl must be first message"); } CleanUpMessage(ptrMessage); StringBuilder dump = new StringBuilder(); //Get the buckets Array hashBuckets = (Array)HashBucketsArrayFieldInfo.GetValue(null); for (int item = 0; item < hashBuckets.Length; item++) { IntPtr handle = (IntPtr)HashBucketHandleFieldInfo.GetValue(hashBuckets.GetValue(item)); if (handle == IntPtr.Zero || handle == MinusOneIntPtr) { //Nothing as not a real window handle } else { Control control = Control.FromHandle(handle); if (control == null) { GCHandle gcHandle = (GCHandle)HashBucketGCHandleFieldInfo.GetValue(hashBuckets.GetValue(item)); Type controlType = gcHandle.Target.GetType(); dump.Append("TypeName: " + controlType.Name); dump.Append(" TypeNameSpace: " + controlType.Namespace); dump.Append(" ModuleName: " + controlType.Module.Name); } else { dump.Append("Name: " + control.Name); Type controlType = control.GetType(); dump.Append(" TypeName: " + controlType.Name); dump.Append(" TypeNameSpace: " + controlType.Namespace); dump.Append(" ModuleName: " + controlType.Module.Name); } //IntPtr parent = NM.GetAncestor(handle, NM.GetAncestorFlags.GetRoot); IntPtr parent = NM.GetAncestor(handle, NM.GetAncestorFlags.GetParent); dump.Append(" Handle: " + handle.ToString()); dump.Append(" Parent: " + parent.ToString()); dump.AppendLine(); } } AddReturnValue(new Parameter(this, dump.ToString())); }
/// <summary> /// Get the type information and puts it in the specified datastore /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void GetTypeInformationActiveX(Message *ptrMessage) { object sourceObject = GetObjectFromDatastore(ptrMessage->SourceStore); object destinationObject = null; if (sourceObject != null) { destinationObject = GetObjectFullTypeName(sourceObject); } PutObjectInDatastore(ptrMessage->DestinationStore, destinationObject); CleanUpMessage(ptrMessage); }
// // GetTabRect // unsafe public void AddQueryMessageGetTabRect(DataStores sourceStore) { Message *ptrMessage = GetPointerToNextMessage(); ptrMessage->SourceStore = sourceStore; ptrMessage->Action = MessageAction.GetTabRect; m_PtrMessageStore->NumberOfMessages++; m_DoneFind = true; m_DoneQuery = true; m_DoneGet = true; }
unsafe public void AddFirstMessageDumpControl() { FirstMessageInitialise(); Message *ptrMessage = GetPointerToNextMessage(); ptrMessage->Action = MessageAction.DumpControl; m_PtrMessageStore->NumberOfMessages++; m_DoneFind = true; m_DoneQuery = true; m_DoneGet = true; }
/// <summary> /// Calls the FlexgridGetAllRowsHeightInternal method on the correct thread storing the results /// in the specified datastore /// </summary> /// <param name="ptrMessage">A pointer to the message</param> unsafe private void FlexgridGetAllRowsHeight(Message *ptrMessage) { object sourceObject = GetObjectFromDatastore(ptrMessage->SourceStore); object destinationObject = null; if (sourceObject != null) { object[] theParameters = { sourceObject }; destinationObject = ((WF.Control)tempStore0).Invoke(m_FlexgridGetAllRowsHeightDelegater, theParameters); } PutObjectInDatastore(ptrMessage->DestinationStore, destinationObject); CleanUpMessage(ptrMessage); }