728x90
반응형
WPF & C# - 실행중인 윈도우 최상위로 실행시키기 ( topmost / process / hWnd / 프로세스 / 프로세서 / 프로그램 ) |
MainWindow.xaml
12345 <Grid><Button x:Name="btn" Content="실행중인 윈도우 가져오기" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="372" Click="btn_Click" /><Button x:Name="btn2" Content="선택된 윈도우 최상위로 가져오기" HorizontalAlignment="Left" Margin="10,339,0,0" VerticalAlignment="Top" Width="372" Click="btn2_Click"/><ListView x:Name="listView1" HorizontalAlignment="Left" Height="299" Margin="10,35,0,0" VerticalAlignment="Top" Width="372"/></Grid>cs
MainWindow.xaml.cs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 // 실행된 프로그램의 핸들값 가져오는데 필요public delegate bool EnumWindowCallback(int hwnd, int lParam);[DllImport("user32.dll")] public static extern int EnumWindows(EnumWindowCallback callback, int y);[DllImport("user32.dll")] public static extern int GetParent(int hWnd);[DllImport("user32.dll")] public static extern int GetWindowText(int hWnd, StringBuilder text, int count);[DllImport("user32.dll")] public static extern long GetWindowLong(int hWnd, int nIndex);// 선택된 프로그램을 최상위에 활성화 시키는데 필요[DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd);[DllImport("user32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);[DllImport("user32.dll")] private static extern bool Get(IntPtr hWnd, int nCmdShow);[DllImport("user32.dll")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);private const int SW_SHOWNORMAL = 1; // Normalprivate const int SW_SHOWMINIMIZED = 2; // 최소화private const int SW_SHOWMAXIMIZED = 3; // 최대화const int GCL_HMODULE = -16;public MainWindow(){InitializeComponent();}// 최상위 올릴 윈도우 찾기public bool EnumWindowsProc(int hWnd, int lParam){//윈도우 핸들로 그 윈도우의 스타일을 얻어옴UInt32 style = (UInt32)GetWindowLong(hWnd, GCL_HMODULE);//해당 윈도우의 캡션이 존재하는지 확인if ((style & 0x10000000L) == 0x10000000L && (style & 0x00C00000L) == 0x00C00000L){//부모가 바탕화면인지 확인if (GetParent(hWnd) == 0){StringBuilder Buf = new StringBuilder(256);//응용프로그램의 이름을 얻어온다if (GetWindowText(hWnd, Buf, 256) > 0){// 리스트뷰에 넣기listView1.Items.Add(Buf.ToString());}}}return true;}private void btn2_Click(object sender, RoutedEventArgs e){// 실행하기string title = listView1.SelectedItem.ToString();topMost(title);}private void btn_Click(object sender, RoutedEventArgs e){// 가져오기EnumWindowCallback callback = new EnumWindowCallback(EnumWindowsProc);EnumWindows(callback, 0);}private void topMost(string title){IntPtr hWnd = FindWindow(null, listView1.SelectedItem.ToString()); // 윈도우 타이틀명으로 핸들을 찾는다ShowWindowAsync(hWnd, SW_SHOWNORMAL);ShowWindowAsync(hWnd, SW_SHOWNORMAL); // 윈도우가 최소화 되어 있다면 활성화 시킨다, 단 중복실행될 수 있다... 주의SetForegroundWindow(hWnd); // 윈도우에 포커스를 줘서 최상위로 만든다}cs
위 프로그램은 아래 두 소스를 합쳐서 만들었다.
필요해서 만들긴했는데, 나도 잘 이해하고 코딩한건 아니라서 너무 슬프다. ㅠㅠ
여튼 아래 두 분 감사합니다. ^^
참고자료 : http://gent.tistory.com/97
728x90
반응형
'Programing (프로그래밍) > WPF & C# (C Sharp)' 카테고리의 다른 글
WPF & C# - SQLite Sample ( 샘플 / SQLlite) (2) | 2018.06.16 |
---|---|
WPF & C# - SQLite 에러 조치 방안 ( SQLlite ) (0) | 2018.06.15 |
WPF & C# - SQLite 설치하기 ( 에러발생 시 조치 방안 / SQLlite) (1) | 2018.06.15 |
WPF & C# - SortedList<TKey,TValue> 클래스 ( 동적배열 / 키 / 값 ) (0) | 2018.06.15 |
WPF & C# - Touch 앱 만들기 첫번째 예제 (0) | 2018.06.15 |
WPF & C# - Progressbar 예제 5가지 ( 프로그래스바 / 프로그레스바 ) (0) | 2018.06.12 |
WPF & C# - 변수란? byte, short, int, long, float, double, char, boolean (0) | 2018.06.12 |
WPF & C# - BitmapImage Cache 로 생성하기 ( 비트맵이미지 캐시 / CacheOption / BypassCache / Uri / 비트맵 캐쉬 ) (0) | 2018.06.12 |