본문 바로가기

Programing (프로그래밍)/WPF & C# (C Sharp)

WPF & C# - 실행중인 윈도우 최상위로 실행시키기 ( topmost / process / hWnd / 프로세스 / 프로세서 / 프로그램 )

728x90
반응형
 WPF & C# - 실행중인 윈도우 최상위로 실행시키기 ( topmost / process / hWnd / 프로세스 / 프로세서 / 프로그램 )

 

topmost.zip
0.72MB

 

MainWindow.xaml

 

 
1
2
3
4
5
<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

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 실행된 프로그램의 핸들값 가져오는데 필요
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;   // Normal
private 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
반응형