[DllImport("user32.dll")]
        public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
        public static void Repair()
        {
            // Ideally this will contain databases for each zone including all repairing NPCs (their names, and locations)
            // and will be able to navigate to the closest one, repair, then go back to the inital location
            Vector3 InitialLocation;
            InitialLocation = Core.Player.Location;
            const uint WM_KEYDOWN = 0x100;
            const uint WM_KEYUP = 0x0101;
            // Add code to target NPC and then
            // move player to the NPC as well
            
            // From here on the code should be fine
            // to complete the repair
            Core.Player.CurrentTarget.Interact();
            Thread.Sleep(1000);  // Wait for the window to open
            IntPtr hWnd;
            string processName = "ffxiv";
            Process[] processList = Process.GetProcesses();
foreach (Process P in processList)
            {
                if (P.ProcessName.Equals(processName))
                {
                    // The following code navigates the window and completes the repair, and then closes the window
                    IntPtr edit = P.MainWindowHandle;
                    if (Core.Target.Name == "Merchant & Mender")
                    {
                        // Merchant & Menders have an additional window before the repair window to navigate
                        PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                        PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                        Thread.Sleep(500);
                        PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
                        PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
                        Thread.Sleep(500);
                        PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
                        PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
                        Thread.Sleep(500);
                        PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                        PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                        PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                        Thread.Sleep(500);
                    }
                    PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad6), IntPtr.Zero);
                    PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad6), IntPtr.Zero);
                    Thread.Sleep(500);
                    PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                    PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                    Thread.Sleep(500);
                    PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad4), IntPtr.Zero);
                    PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad4), IntPtr.Zero);
                    Thread.Sleep(500);
                    PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                    PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
                    Thread.Sleep(500);
                    PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.Escape), IntPtr.Zero);
                    PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.Escape), IntPtr.Zero);
                }
            }
            Logging.Write("[Magitek] Repaired!");
            // Add logic to get back to the initial location
        }