// For GUIDebugStepExe Debugging Only - Uncomment this #define #define GUIDEBUGSTEPEXE using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Drawing; using System.Threading; using System.Windows.Interop; using System.EnterpriseServices; using System.Windows; using System.IO; using System.Windows.Threading; using System.Collections; using System.Reflection; // Ooganizer Namespaces using Foo.GUILib; using Foo.Platform; using Foo.Platform.Win32; using Foo.Platform.Interacters; using Foo.Platform.ErrorReporting; namespace Foo.ClientServices.ButtonWPForm { /// /// ButtonWPFormCCW - Com Callable Wrapper Class exposed to ButtonHook. /// This class is responsible for creating the ButtonWPForm (a form created in response to a ButtonHook W32 Click) /// [Guid("6F108F0B-9CEB-4d3d-B1D9-7685F9F39E50")] [ClassInterface(ClassInterfaceType.None)] [ProgId("Foo.ClientServices.ButtonWPFormCCW")] [ComVisible(true)] [ObjectPooling(Enabled = true, MinPoolSize = 1, MaxPoolSize = 2500, CreationTimeout = 5000)] #if GUIDEBUGSTEPEXE public class ButtonWPFormCCW : IButtonForm, IClientEvents #else public class ButtonWPFormCCW : ServicedComponent, IButtonForm, IClientEvents, IProcessInitializer #endif { //// // Member Variables //// private IntPtr m_hWnd = IntPtr.Zero; private IntPtr m_hWndParent = IntPtr.Zero; private IntPtr m_hWndButton = IntPtr.Zero; BHInteracter.BUTTON_HOOK_STATE m_ButtonState = BHInteracter.BUTTON_HOOK_STATE.BUTTON_NONE; // Declare the Log4net Variable private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); #region Construction / Destruction public ButtonWPFormCCW() {} ~ButtonWPFormCCW() {} #endregion #if GUIDEBUGSTEPEXE #region GuiDebugStepCustomStarterStopers public void Start() { Log.Info(string.Format("{0}() - ComponentState Application Is being started", MethodBase.GetCurrentMethod().Name)); ComponentState.ApplicationIsRunning = true; } public void Stop() { Log.Info(string.Format("{0}() - ComponentState Application Is being stopped", MethodBase.GetCurrentMethod().Name)); ComponentState.ApplicationIsRunning = false; } #endregion #else #region IProcessInitializer Members public void Startup(object punkProcessControl) { Log.Info(string.Format("{0}() - ComponentState Application Is being started", MethodBase.GetCurrentMethod().Name)); ComponentState.ApplicationIsRunning = true; } public void Shutdown() { Log.Info(string.Format("{0}() - ComponentState Application Is being stopped", MethodBase.GetCurrentMethod().Name)); ComponentState.ApplicationIsRunning = false; } #endregion #endif #region ButtonHook Activation/Deactivation /// /// This is called first time when the buttonhook is attaching into a Window. It passes us /// important handle information that we need or may need to communicate back state information. /// /// the handle to the window the buttonhook is hooked into /// the handle to the button Window (we need it if we want to communicat with it) public void WPFThreadProc_ButtonWPForm_Activated(int hParentWND, int hButtonWND) { // Store the handle information for later use m_hWndParent = (IntPtr)hParentWND; m_hWndButton = (IntPtr)hButtonWND; } /// /// Called when the buttonhook is unattaching itself from a Window. /// Here, we can do any cleanup that we may have to do. /// public void WPFThreadProc_ButtonWPForm_Deactivated() { try { if ((m_hWndParent != IntPtr.Zero) && (ComponentState.ButtonFormMgr != null)) ComponentState.ButtonFormMgr.Delete_ButtonFormDISP((int)m_hWndParent); } catch (Exception e) { Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); } } #endregion #region Custom Events /// /// This function is called when the Win32 button is clicked. This function should /// handle the creation of the wpfform and display it over the window /// /// the window handle to the newly created wpfform to be stored by the caller public int W32BUTTONCLICKED() { try { // Let's Position the Window and snapshot it... Image snapshot = null; try { BHInteracter.SetW32ButtonToNewState(m_hWndParent, BHInteracter.BUTTON_HOOK_STATE.BUTTON_NONE); System.Threading.Thread.Sleep(100); snapshot = GUICommon.PositionWindowToGoldenPosAndTakeSnapshot(m_hWndParent, true); } catch (Exception e) { UserError.Show("Snapshot Failed", "Obtaining a Snaphot for the Window Failed."); Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); return 0; } if (snapshot != null) { // Create the WpfForm object and then create the wpfform window and show it. ComponentState.ButtonFormMgr.Create_ButtonFormDISP((int)m_hWndParent, snapshot); m_hWnd = (IntPtr) ComponentState.ButtonFormMgr.Create_ButtonFormWindowDISP((int)m_hWndParent); return (int)m_hWnd; } else { UserError.Show("Snapshot Failed", "Obtaining a Snaphot for the Window Failed."); Log.Error(string.Format("{0}() - UserError.Show() - Obtaining a Snapshot Failed", MethodBase.GetCurrentMethod().Name)); return 0; } } catch (Exception e) { UserError.Show("Snapshot Failed", "Obtaining a Snaphot for the Window Failed."); Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); return 0; } } #endregion #region Window Events we can extend on public void WindowEvent_MaximizeOccured(int nHeight, int nWidth) { } public void WindowEvent_MinimizeOccured() { } public void WindowEvent_WindowActivated() { } public void WindowEvent_WindowDeactivated() { } #endregion #region Resolver Client Events public void ReResolve(int pid, IntPtr hWnd) { Log.Debug(string.Format("{0}() - Debug - ReResolve is called for {0} and {1}", pid, hWnd)); } public void hWndInitialActivate(int pid, IntPtr hWnd, string ProcessStartUpPrms) { try { m_ButtonState = BHInteracter.SetW32ButtonToNewState(m_hWndParent, BHInteracter.BUTTON_HOOK_STATE.BUTTON_ADD); Log.Debug(string.Format("{0}() - --- TEST --- ProcessStartUpPrms", ProcessStartUpPrms)); //// We need to resolve the window here //ResolverDispatch resolver = new Resolver.ResolverDispatch(); //ArtifactGroup artifacts = resolver.GetArtifacts((IntPtr)hWnd); //// If we can resolve this window then we want to be checking //if (artifacts.Length >= 1) //{ // Artifact curArtifact = artifacts.GetPrimary; // bool bFound = SrvrCommon.IsArtifactInCurrentWorkspace(curArtifact); // if (bFound) // m_ButtonState = BHInteracter.SetW32ButtonToNewState(m_hWndParent, BHInteracter.BUTTON_HOOK_STATE.BUTTON_DELETE); // else // m_ButtonState = BHInteracter.SetW32ButtonToNewState(m_hWndParent, BHInteracter.BUTTON_HOOK_STATE.BUTTON_ADD); //} //else //{ // Log.Error(string.Format("{0}() - WPForm could not resolve this Window - disabling the Caption Button", MethodBase.GetCurrentMethod().Name)); // m_ButtonState = BHInteracter.SetW32ButtonToNewState(m_hWndParent, BHInteracter.BUTTON_HOOK_STATE.BUTTON_NONE); //} } catch (Exception e) { Log.Error(string.Format("{0}() - WPForm could not resolve this Window - disabling the Caption Button", MethodBase.GetCurrentMethod().Name), e); } } public void hWndLastDeactivate(int pid, IntPtr hWnd) { Log.Debug(string.Format("{0}() - Debug - hWndLastDeactivate is called for {0} and {1}", pid, hWnd)); } public void DragNDropOccured(int pid, IntPtr hWnd, int nFiles, string SemiColonSepFileNames) { Log.Debug(string.Format("{0}() - Debug - DragNDropOccured is called with {0} and {1} and {2}", pid, hWnd, nFiles, SemiColonSepFileNames)); } public void OpenOrSaveFileDialogOccured(int pid, IntPtr hWnd, string possibleLocAndFileName, string FileTypes) { Log.Debug(string.Format("{0}() - Debug - DragNDropOccured is called with {0} and {1} and {2}", pid, hWnd, possibleLocAndFileName, FileTypes)); } #endregion } }