2014-12-12 6 views
0

응용 프로그램을 전환하고 변수에 할당하는 데 문제가 있습니다. 이것은 내가 지금까지 가지고있는 것이다.응용 프로그램을 전환하고 인스턴스에 할당하십시오.

[DllImport("user32.dll")] 
public static extern void SwitchToThisWindow(IntPtr hWnd, bool b); 

Process[] procs = Process.GetProcessesByName("Excel"); 
foreach (Process proc in procs) 
{ 
    SwitchToThisWindow(proc.MainWindowHandle, false); 
} 

마지막으로 해당 Excel 창을 xlApp에 할당하도록 지정하고 싶습니다. 나는 시도했다 :
xlAppl = SwitchToThisWindow(proc.MainWindowHandle, false); 분명히 이것은 인터페이스가 무효이기 때문에 작동하지 않을 것이다. 내가 보았던 GetActiveWindow 나는 액티브 윈도우를 얻고 그것을 할당하려고 생각했지만 반환 값은 IntPtr 객체가 아니다. 출구가 있습니까?

+0

달성하려는 목표가 명확하지 않습니다. 뭘 배정 하시겠습니까? 기대하는 수익 가치는 무엇입니까? –

+0

proc.MainWindowHandle에 Excel 창에 대한 참조가있는 경우 'IntPtr excel = proc.MainWindowHandle;'가 아닌가? –

답변

1

내가 지금까지이 일에 대해 지적하고 싶은 몇 가지가 있습니다 SwitchToThisWindow MSDN 들어

  1. 이 상태 - [이 기능은 일반적으로 사용하기위한 것이 아닙니다. 이후 버전의 Windows에서는 변경되거나 사용 불가능할 수 있습니다.]. 그래서 나는 개인적으로 그 사람을 사용하지 않을 것입니다.
  2. Process.GetProcessByName 호출이 모든 Excel 프로세스를 반환합니다. 그런 다음 각 하나를 포 그라운드로 가져 오려고합니다. 포어 그라운드에 모두있을 수는 없으므로 코스의 마지막 하나만 실제로 포 그라운드에있게됩니다. 당신은 아마 당신이 원하는 것을 선택하는 더 정확한 방법을 결정해야합니다.
  3. MainWindowHandle이 모든 경우에 유효한 가정이 아닌 IntPtr.Zero가 아니라고 가정합니다. MainWindowHandle은 렌더링 된 보이는 윈도우가있는 경우에만 값을 갖습니다.

내가 너라면 SetForegroundWindowSetActiveWindow 개의 API를 대신 사용해 보려고합니다.

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern bool SetForegroundWindow(
    IntPtr hWnd 
    ); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr SetActiveWindow(
    IntPtr hWnd 
    ); 
0

사람들은 해결책을 찾았습니다. 여기 누군가가 이것을 찾고 있다면 대답은 매우 간단합니다.

Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");