Как переместить невидимое приложение - PullRequest
0 голосов
/ 01 октября 2019

Это дополнительный вопрос к одному из ответов, предоставленных для сообщения Quit () заставляет Access на мгновение стать видимым .

В ответе рекомендуется переместить окно за пределы экрана, чтобы мерцающее окно не было видно.

Если я понимаю принятый ответ на вопрос C # Process.MainWindowHandle всегда возвращает IntPtr Zero

Приложение, которое изменило свою видимость (accApp.Visible = false;), не имеет/ return / initialize / ... IntPtr, и он всегда будет установлен на ноль.

Как я могу переместить это окно / приложение за пределы экрана, чтобы пользователи никогда его не увидели. Я не хочу делать это видимым, а затем заставлять мою программу высовывать / перемещать ее с экрана после. Если нет способа предотвратить распространение видимости на глаза пользователей (не хочу видеть окно когда-либо).

Теоретически я могу как-то приостановить рендеринг экрана, сделать его видимым, переместить его и затем возобновить рендеринг экрана? (сомнительно, что это хорошее решение)

Начиная с моего предыдущего поста, я переместил код, создающий приложение, в отдельный класс, чтобы позволить запускать только один экземпляр приложения вместо предыдущего способа, который генерировалновое приложение для каждого запроса.

public class ConnectionManager
{
    [DllImport("user32.dll")]
    static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);

    //Old Code for tying to resolve flashing access window. 
    //[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    //public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);


    public ConnectionManager()
    {
        Console.WriteLine("Connection Manager Started");
        AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);

    }

    void OnProcessExit(object sender, EventArgs e)
    {
         BreakAllConnections();
    }

    private Microsoft.Office.Interop.Excel.Application _excelApp;
    public Microsoft.Office.Interop.Excel.Application excelApp
    {
        get
        {
            if (_excelApp == null)
            {
                try
                {
                    _excelApp = new Microsoft.Office.Interop.Excel.Application();
                }
                catch
                {
                    //TODO Add Termination
                    MessageBox.Show("Abort Error: Could not open Exel Application");
                }
            }
            return _excelApp;
        }

    }

    private Microsoft.Office.Interop.Access.Application _accessApp;
    public Microsoft.Office.Interop.Access.Application accessApp
    {
        get
        {
            if (_accessApp == null)
            {
                try
                {
                    _accessApp = new Microsoft.Office.Interop.Access.Application();
                    //Old Code for tying to resolve flashing access window. 
                    //GetWindowThreadProcessId(_accessApp.hWndAccessApp(), out int id);

                    //IntPtr handle = Process.GetProcessById(id).MainWindowHandle;
                    //if (handle != IntPtr.Zero)
                    //{
                    //    const short SWP_NOSIZE = 1;
                    //    const short SWP_NOZORDER = 0X4;
                    //    SetWindowPos(handle, 0, 10000, 10000, 0, 0, SWP_NOZORDER | SWP_NOSIZE | 0);
                    //}
                }
                catch
                {
                    //TODO Add Termination
                    MessageBox.Show("Abort Error: Could not open Exel Application");
                }
            }
            return _accessApp;
        }

    }

    public void BreakAllConnections()
    {

        try
        {
            if (_excelApp != null) { _excelApp.Quit(); Marshal.ReleaseComObject(_excelApp); }
        }
        catch
        {
            GetWindowThreadProcessId(_excelApp.Hwnd, out int id);
            Process.GetProcessById(id).Kill();
        }

        try
        {
            if (_accessApp != null) { _accessApp.Quit(); Marshal.ReleaseComObject(_accessApp); }
        }
        catch
        {
            GetWindowThreadProcessId(_accessApp.hWndAccessApp(), out int id);
            Process.GetProcessById(id).Kill();
        }
    }
}
...