Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
1

Отследить определенный процесс и по условию показать форму

17.03.2014, 15:46. Показов 1097. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я пишу программу для игры WarFace, я хочу реализовать что то вроде D3D меню, т.е мне нужно, чтобы моя форма отображалась ТОЛЬКО в игре(В левом верхнем углу), если же игра скрывается, то и скрывается моя форма, если открывается, то и появляется моя форма, а также происходило слежение позиции окна игры и перемещалась вместе с ним.

Добавлено через 2 часа 2 минуты
Что? Никто не знает как это реализовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2014, 15:46
Ответы с готовыми решениями:

Как отследить окончание всех операций и показать итоговую форму
Есть довольно сложная стартующая форма (VB 2010) Чтобы скрыть процесс использую Visible в...

Как отследить процесс?
Всем привет. Интересует такой вопрос, как с помощью php отследить запуск процесса на компьютере?

Как отследить адрес подключения на определённый порт?
Есть шлюз на дебиане, на нем стоит Squid3 и проброшен 3389 порт на комп в локалке. Подскажите...

Отследить процесс репликации, сжатия и др.
Добрый день! При репликации БД на локальный компьютер сам процесс репликации очень хорошо...

6
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
18.03.2014, 10:12 2
В общем то задача не лёгкая, поэтому долго не отвечали.
Нужно использовать WINAPI, Потоки и соответственно делегаты. Вот поэкспериментировал и вроде получилось
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
 
namespace Excelike
{
    public partial class Form1 : Form
    {
        public Thread[] tr = new Thread[1];
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport("User32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
        public delegate void Form1_change(int Left, int Top, Form1 fm, bool exit);
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }
 
        private void ChangePosition(int Left, int Top, Form1 fm,bool exit)                                       // Метод, нужен для доступа к Label из любого потока
        {
            if (exit)
            {
                Application.Exit();
            }
            else
            {
                fm.Show();
                fm.Location = new System.Drawing.Point(Left, Top);
            }
        }
        private void Exit()
        {
            Application.Exit();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 fm = new Form1();
            fm.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            fm.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            fm.ClientSize = new System.Drawing.Size(321, 309);
            fm.Name = "Form2";
            fm.Text = "Form2";
            fm.TopMost = true;
            this.Hide();
            fm.Show();
            fm.tr[0] = new Thread(delegate() { searchWindow(fm); });
            tr[0] = fm.tr[0];
            fm.tr[0].Start();
        }
        private void searchWindow(Form1 fm)
        {
            Form1_change coch = new Form1_change(ChangePosition);
            RECT rct = new RECT();
            while (true)
            {
                Thread.Sleep(5);
                Process[] processes = Process.GetProcessesByName("TOTALCMD");
                if (processes.Count() == 0)
                {
                    fm.BeginInvoke(coch, new object[] { 0, 0, fm,true });
                }
                else
                {
                    foreach (Process p in processes) //перебор, если несколько
                    {
                        IntPtr pFoundWindow = p.MainWindowHandle; //получаем хендл
                        GetWindowRect(pFoundWindow, ref rct);
                    }
                    fm.BeginInvoke(coch, new object[] { rct.Left, rct.Top, fm,false});
                }
            }
        }
    }
}
В Designer.cs функцию Dispose нужно поправить, и она будет иметь вид:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        protected override void Dispose(bool disposing)
        {
            if (tr[0] != null)
            {
                tr[0].Abort();
            }
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
            Exit();
        }
Так как при манипулировании основной формой своего приложения бывают некоторые проблемы я создавал дополнительную форму. Цеплял форму к Тоталкомандеру
C#
1
Process[] processes = Process.GetProcessesByName("TOTALCMD");
(советую тоже поэкспериментировать, с тоталом или каким-нибудь браузером, например)
1
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
18.03.2014, 16:27  [ТС] 3
Спасибо большое, буду тестировать Иии...робко спрошу: можете дать готовый проект? Так сказать, для наглядности ^_^
0
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
18.03.2014, 17:08 4
Архив проекта? Я и так весь код почти написал)
Ну мне не жалко, ок
Вложения
Тип файла: rar Excelike.rar (41.1 Кб, 6 просмотров)
1
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
18.03.2014, 19:20  [ТС] 5
Огромное спасибо!

Добавлено через 12 минут
Сразу нашёлся 1 "Баг":
Если в браузере навести курсор на какую нибудь кнопку(На форуме, например), то форма автоматически перемещается к ней.
P.S: А возможно сделать так, чтобы форма не выходила на панель управления(Там, где кнопки Закрыть, развернуть, скрыть)?

Добавлено через 15 минут
+ форма не отображается в игре ;(
0
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
19.03.2014, 09:23 6
Исправить баг и
А возможно сделать так, чтобы форма не выходила на панель управления(Там, где кнопки Закрыть, развернуть, скрыть)?
можно,вот код поправил:
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
103
104
105
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
 
namespace Excelike
{
    public partial class Form1 : Form
    {
        public Thread[] tr = new Thread[1];
        IntPtr pMain = (IntPtr)0;
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport("User32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
        public delegate void Form1_change(int Left, int Top, Form1 fm, bool exit);
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }
 
        private void ChangePosition(int Left, int Top, Form1 fm,bool exit)                                       // Метод, нужен для доступа к Label из любого потока
        {
            if (exit)
            {
                Application.Exit();
            }
            else
            {
                fm.Show();
                fm.Location = new System.Drawing.Point(Left, Top);
            }
        }
        private void Exit()
        {
            Application.Exit();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 fm = new Form1();
            fm.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            fm.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            fm.ClientSize = new System.Drawing.Size(321, 309);
            fm.Name = "Form2";
            fm.Text = "Form2";
            fm.TopMost = true;
            fm.ShowInTaskbar = false;
            fm.ShowIcon = false;
            fm.FormBorderStyle = FormBorderStyle.None;
            this.Hide();
            fm.Show();
            fm.tr[0] = new Thread(delegate() { searchWindow(fm); });
            tr[0] = fm.tr[0];
            fm.tr[0].Start();
        }
        private void searchWindow(Form1 fm)
        {
            Form1_change coch = new Form1_change(ChangePosition);
            RECT rct = new RECT();
            IntPtr pFoundWindow = (IntPtr)0;;
            while (true)
            {
                Thread.Sleep(5);
                Process[] processes = Process.GetProcessesByName("chrome");
                if (processes.Count() == 0)
                {
                    fm.BeginInvoke(coch, new object[] { 0, 0, fm,true });
                }
                else
                {
                    if (pMain.ToInt32() == 0)
                    {
                        foreach (Process p in processes) //перебор, если несколько
                        {
                            pFoundWindow = p.MainWindowHandle; //получаем хендл
                            if (pFoundWindow.ToInt32() != 0)
                            {
                                pMain = pFoundWindow;
                            }
                        }
                    }
                    else
                    {
                        GetWindowRect(pMain, ref rct);
                        fm.BeginInvoke(coch, new object[] { rct.Left, rct.Top, fm, false });
                    }
                }
            }
        }
    }
}
А вот
+ форма не отображается в игре ;(
я этого ожидал
Тестить и подгонять под вашу игру уже нужно вам..
Я попробовал к фуллскриновому видео - форма коннектиться, пробовал к оконному приложению, которое само по умолчанию стоит поверх всех окон - то же вроде всё нормально. WarFace у меня не стоит))
Единственное - могу попробовать дома (сейчас на работе) приконнектить к WarCraft )
P.S. отследите в диспетчере задач, какие процессы создаются при запуске игры - возможно создаётся не 1 процесс, ещё в режиме отладки Visual Studio - нужно смотреть какие дескрипторы окон берутся при p.MainWindowHandle. Ещё поищите инфу, мб найдёте, как выводится программа fraps в играх
0
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
19.03.2014, 12:11  [ТС] 7
Цитата Сообщение от es_ Посмотреть сообщение
Ещё поищите инфу, мб найдёте, как выводится программа fraps в играх
Fraps именно РИСУЕТ, а не накладывает какую либо форму ...вообщем забил я на это дело
0
19.03.2014, 12:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2014, 12:11
Помогаю со студенческими работами здесь

Отследить процесс загрузки изображения.
Как отследить, что картинка загрузилась при выполнении кода $('#cont_img').attr('src') =...

Отследить процесс в диспетчере задач
Доброе время суток! Такой вопрос у меня. Как можно отследить процесс (по имени) в диспетчере задач,...

Как отследить процесс сходимости функции?
Здравствуйте! По ссылке фото с заданием, смотреть пункт 6.3, вариант 19. Вопрос следующий: как...

Как отследить процесс копирования файлов?
Ну вот надо отследить.


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

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