Это дополнительный вопрос к одному из ответов, предоставленных для сообщения 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();
}
}
}