С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
-7 / 12 / 1
Регистрация: 01.09.2012
Сообщений: 60
1

Как проследить из формы, свернута сторонняя программа или нет

03.09.2012, 21:27. Показов 1508. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как проследить из формы, свернута программа или нет?
Пример: Запустили из формы кликом по кнопке1 Блокнот, а потом свернули, а форма вывела в лейбл1 статус нашего блокнота ВЫ ЕГО СВЕРНУЛИ! РАЗВЕРНУТЬ? При последующем нажатии по кнопке1, разворачиваем наш любимый блокнот...

Тяжелая тема, но думаю всем интересно и пригодится...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2012, 21:27
Ответы с готовыми решениями:

При запуске программа свернута, как исправить?
Решил начать изучать gui и как пример решил попробовать сделать окно авторизации. В ходе многих...

Как определить показана ли форма, или свернута на панель
Вопрос в заголовке....жду ваших предложений)

Как корректно сохранить настройки формы, если в момент закрытия она была свернута?
Добрый день товарищи. Столкнулся с проблемой. Есть форма, если ее закрывать и открывать все норм....

Как узнать что сторонняя программа закрылась
Здраствуйте уважаемые знатоки. Можно ли как то узнать, или отловить момент закрытия программы?...

3
Почетный модератор
Эксперт .NET
8722 / 3674 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.09.2012, 23:21 2
Можно использовать WinEvents для этого.
Пример с блокнотом:
pinvoke.cs
C#
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
using System;
using System.Runtime.InteropServices;
 
namespace pinvoke
{
    static class User32
    {
        const string USER32 = "user32.dll";
 
        public const uint EVENT_SYSTEM_MINIMIZESTART = 0x16;
        public const uint EVENT_SYSTEM_MINIMIZEEND = 0x17;
        public const uint WINEVENT_OUTOFCONTEXT = 0x0;
 
        public delegate void WINEVENTPROC (
            IntPtr hWinEventHook,
            uint dwEvent,
            IntPtr hWnd,
            int idObject,
            int idChild,
            uint dwEventThread,
            uint dwmsEventTime
            );
 
        [DllImport( USER32, SetLastError = true )]
        public static extern IntPtr SetWinEventHook (
            [In] uint eventMin,
            [In] uint eventMax,
            [In] IntPtr hmodWinEventProc,
            [MarshalAs( UnmanagedType.FunctionPtr )]
            [In] WINEVENTPROC lpfnWinEventProc,
            [In] int idProcess,
            [In] int idThread,
            [In] uint dwflags
            );
 
        [DllImport( USER32, SetLastError = true )]
        [return: MarshalAs( UnmanagedType.Bool )]
        public static extern bool UnhookWinEvent (
            [In]  IntPtr hWinEventHook
            );
    }
}
Form1.cs
C#
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
70
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace WindowsFormsApplication10
{
    public partial class Form1 : Form
    {
        bool installed;
        IntPtr hWinEventhook;
 
        public Form1 ( )
        {
            InitializeComponent();
        }
 
        private void button1_Click ( object sender, EventArgs e )
        {
            if ( installed && pinvoke.User32.UnhookWinEvent( hWinEventhook ) )
                installed = false;
            else if ( !installed )
            {
                var procs = Process.GetProcessesByName( "notepad" );
 
                if ( procs.Length > 0 )
                    hWinEventhook = pinvoke.User32.SetWinEventHook(
                                        pinvoke.User32.EVENT_SYSTEM_MINIMIZESTART,
                                        pinvoke.User32.EVENT_SYSTEM_MINIMIZEEND,
                                        IntPtr.Zero,
                                        WinEventProc,
                                        procs[0].Id,
                                        0,
                                        pinvoke.User32.WINEVENT_OUTOFCONTEXT
                                        );
 
                if ( hWinEventhook != IntPtr.Zero )
                    installed = true;
                else
                    MessageBox.Show(
                        "Can't install winevent hook, err " +
                            Marshal.GetLastWin32Error()
                            );
            }
        }
 
        void WinEventProc (
            IntPtr hWinEventHook,
            uint dwEvent,
            IntPtr hWnd,
            int idObject,
            int idChild,
            uint dwEventThread,
            uint dwmsEventTime
            )
        {
            Debug.WriteLine(
                string.Format(
                    "Event: {0}\r\n\tHWND: 0x{1:X8}\r\n\tidObject: {2}\r\n\tidChild: {3}\r\n\tdwEventThread: 0x{4:X8}\r\n\tTime: {5}",
                    dwEvent,
                    hWnd,
                    idObject,
                    idChild,
                    dwEventThread,
                    dwmsEventTime
                    )
                );
        }
    }
}
Посмотрите описание используемых WinAPI, там еще много событий можно использовать, и при необходимости - глобально.

Чтобы просто получить состояние окна, можно использовать GetWindowPlacement.
1
-7 / 12 / 1
Регистрация: 01.09.2012
Сообщений: 60
04.09.2012, 09:40  [ТС] 3
SSTREGG, Большое вам спасибо, за пример и извини за наглость, но можно теперь это выводить как то в Лейбл? и если не сложно пример с GetWindowPlacement...
0
Почетный модератор
Эксперт .NET
8722 / 3674 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.09.2012, 15:13 4
pinvoke.cs
C#
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
70
71
72
73
74
75
76
using System;
using System.Runtime.InteropServices;
 
namespace pinvoke
{
    static class User32
    {
        const string USER32 = "user32.dll";
 
        public const uint EVENT_SYSTEM_MINIMIZESTART = 0x16;
        public const uint EVENT_SYSTEM_MINIMIZEEND = 0x17;
        public const uint WINEVENT_OUTOFCONTEXT = 0x0;
 
        public delegate void WINEVENTPROC (
            IntPtr hWinEventHook,
            uint dwEvent,
            IntPtr hWnd,
            int idObject,
            int idChild,
            uint dwEventThread,
            uint dwmsEventTime
            );
 
        [DllImport( USER32, SetLastError = true )]
        public static extern IntPtr SetWinEventHook (
            [In] uint eventMin,
            [In] uint eventMax,
            [In] IntPtr hmodWinEventProc,
            [MarshalAs( UnmanagedType.FunctionPtr )]
            [In] WINEVENTPROC lpfnWinEventProc,
            [In] int idProcess,
            [In] int idThread,
            [In] uint dwflags
            );
 
        [DllImport( USER32, SetLastError = true )]
        [return: MarshalAs( UnmanagedType.Bool )]
        public static extern bool UnhookWinEvent (
            [In]  IntPtr hWinEventHook
            );
 
        [StructLayout( LayoutKind.Sequential )]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
 
        [StructLayout( LayoutKind.Sequential )]
        public struct POINT
        {
            public int x;
            public int y;
        }
 
        [StructLayout( LayoutKind.Sequential )]
        public struct WINDOWPLACEMENT
        {
            public int length;
            public uint flags;
            public uint showCmd;
            public POINT ptMinPosition;
            public POINT ptMaxPosition;
            public RECT  rcNormalPosition;
        }
 
        [DllImport( USER32, SetLastError = true )]
        [return: MarshalAs( UnmanagedType.Bool )]
        public static extern bool GetWindowPlacement (
            [In] IntPtr hWnd,
            [In, Out] ref WINDOWPLACEMENT lpwndpl
            );
    }
}
Form1.cs
C#
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace WindowsFormsApplication10
{
    public partial class Form1 : Form
    {
        bool installed;
        IntPtr hWinEventhook;
 
        public Form1 ( )
        {
            InitializeComponent();
        }
 
        private void button1_Click ( object sender, EventArgs e )
        {
            if ( installed && pinvoke.User32.UnhookWinEvent( hWinEventhook ) )
                installed = false;
            else if ( !installed )
            {
                var procs = Process.GetProcessesByName( "notepad" );
 
                if ( procs.Length > 0 )
                    hWinEventhook = pinvoke.User32.SetWinEventHook(
                                        pinvoke.User32.EVENT_SYSTEM_MINIMIZESTART,
                                        pinvoke.User32.EVENT_SYSTEM_MINIMIZEEND,
                                        IntPtr.Zero,
                                        WinEventProc,
                                        procs[0].Id,
                                        0,
                                        pinvoke.User32.WINEVENT_OUTOFCONTEXT
                                        );
 
                if ( hWinEventhook != IntPtr.Zero )
                    installed = true;
                else
                    MessageBox.Show(
                        "Can't install winevent hook, err " +
                            Marshal.GetLastWin32Error()
                            );
            }
        }
 
        void WinEventProc (
            IntPtr hWinEventHook,
            uint dwEvent,
            IntPtr hWnd,
            int idObject,
            int idChild,
            uint dwEventThread,
            uint dwmsEventTime
            )
        {
            Debug.WriteLine(
                string.Format(
                    "Event: {0}\r\n\tHWND: 0x{1:X8}\r\n\tidObject: {2}\r\n\tidChild: {3}\r\n\tdwEventThread: 0x{4:X8}\r\n\tTime: {5}\r\n",
                    dwEvent,
                    hWnd,
                    idObject,
                    idChild,
                    dwEventThread,
                    dwmsEventTime
                    )
                );
 
            switch ( dwEvent )
            {
            case pinvoke.User32.EVENT_SYSTEM_MINIMIZEEND:
                label1.Text = "Блокнот открыт";
                break;
            case pinvoke.User32.EVENT_SYSTEM_MINIMIZESTART:
                label1.Text = "Блокнот свёрнут";
                break;
            }
        }
 
        private void button2_Click ( object sender, EventArgs e )
        {
            var hWnd = Process.GetProcessesByName( "notepad" )[0].MainWindowHandle;
 
            var wndInfo = new pinvoke.User32.WINDOWPLACEMENT();
            wndInfo.length = Marshal.SizeOf( wndInfo );
 
            if ( !pinvoke.User32.GetWindowPlacement( hWnd, ref wndInfo ) )
            {
                MessageBox.Show(
                    "Can't get wnd placement, err " +
                    Marshal.GetLastWin32Error()
                    );
                return;
            }
 
            if ( wndInfo.showCmd == 2 /* SW_SHOWMINIMIZED */)
                label2.Text = "Блокнот свёрнут";
            else
                label2.Text = "Блокнот открыт";
        }
    }
}
1
04.09.2012, 15:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2012, 15:13
Помогаю со студенческими работами здесь

Как определить на каком мониторе находится сторонняя программа?
Привет всем, как определить на каком мониторе находится сторонняя программа, к примеру блокнот или...

Как узнать: работает ли какая-либо сторонняя программа
Добрый вечер. Появился вопрос: как можно проверить работает ли какая-то программа в данный момент....

Как сделать так, чтобы программа реагировала на нажатие кнопок даже когда она свернута?
Всем добрый день! Знаю много раз такое спрашивали, но у меня нечего не получилось, поэтому прошу в...

Как определить состояние формы (загружена или нет)?
Как можно определить загружена форма или нет?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru