2013-10-01 2 views
4

C# .NET에서 개발 된 작은 응용 프로그램을 가지고있는 작은 응용 프로그램을 가지고 있는데 왜 어떤 사용자가 계속 엑셀 파일을 열 때 윈도우가 앞/위쪽에 나타나지 않지만 사실을 볼 수는 있지만 말하지는 않습니다. 창 상태는 최대화됩니다.창문을 앞으로 가져 오는 힘?

public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null) 
{ 
    string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\AddIns\\mDF_XLcalendar.xla"); 

    deleg = fn; 
    app = new Excel.Application(); 

    app.Workbooks.Open(addInPath); 
    app.Workbooks.Open(fileName); 

    app.ScreenUpdating = true; 
    app.DisplayAlerts = true; 
    app.Visible = visibility; 
    app.UserControl = true; 
    app.WindowState = Excel.XlWindowState.xlMaximized; 

    EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose); 
    EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave); 

    app.WorkbookBeforeClose += EventDel_BeforeBookClose; 
    app.WorkbookBeforeSave += EventSave_BeforeBookClose;  
} 

어떤 아이디어 :

이것은 엑셀 파일을 읽는 기능은 무엇입니까?

+0

가 될 것인가? – gunr2171

+1

.Net 코드에 Excel 응용 프로그램이 실행 된 후 실행될 코드가 남아있는 경우 프로그램에 포커스가 다시 설정됩니다. 그리고 프로그램에 GUI가 있다면 Excel의 위에있을 것입니다. 그래서 당신이 시도 할 수있는 한가지는 UR 코드의 끝으로 Excel을 열어 놓는 것입니다. –

+1

나는이 방법을 시도했으나 제대로 작동하지 않았습니다. 문제는 제대로 작동하기 때문에 컴퓨터에서 문제를 재현 할 수 없다는 것입니다 내 ... –

답변

3

에서 (기본 WinAPI를을 포함하는 호출)

app.ActiveWindow.Activate(); 

하여 엑셀 창을 활성화하려고 할 것 파일을 Excel에서 동시에 열면 ActiveWindow.Activate()이 작동하지 않습니다.

성공적인 트릭은 최소화 및 최대화 명령을 수행하는 것입니다.

4

이 문제가 발생했습니다. 후반 How to bring an Excel app to the front

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

public static void BringExcelWindowToFront(Application xlApp) 
{ 

    string caption = xlApp.Caption; 
    IntPtr handler = FindWindow(null, caption); 
    SetForegroundWindow(handler); 
} 
2

조금씩 알아,하지만 필요를 FindWindow를 사용하는 이유는, 윈도우 핸들은 응용 프로그램을 통해 액세스 :

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

public static void BringExcelWindowToFront(Application xlApp) 
{ 
    SetForegroundWindow((IntPtr)xlApp.Hwnd); // Note Hwnd is declared as int 
} 
가 는 아무런 문제가 없을 것 이상의 윈도우가있다

경우 같은 캡션.

2

마법, 나를 위해 그 일 : 당신은 당신이 실제로 통합 문서를 열 후`WindowState`를 설정하고 있기 때문에

app.WindowState = XlWindowState.xlMinimized; // -4140 
app.WindowState = XlWindowState.xlMaximized; // -4137 
관련 문제