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

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

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

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

Добавлено через 2 часа 2 минуты
Что? Никто не знает как это реализовать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2014, 15:46
Ответы с готовыми решениями:

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

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

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

6
 Аватар для es_
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
18.03.2014, 10:12
В общем то задача не лёгкая, поэтому долго не отвечали.
Нужно использовать 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
 Аватар для Excelike
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
18.03.2014, 16:27  [ТС]
Спасибо большое, буду тестировать Иии...робко спрошу: можете дать готовый проект? Так сказать, для наглядности ^_^
0
 Аватар для es_
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
18.03.2014, 17:08
Архив проекта? Я и так весь код почти написал)
Ну мне не жалко, ок
Вложения
Тип файла: rar Excelike.rar (41.1 Кб, 6 просмотров)
1
 Аватар для Excelike
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
18.03.2014, 19:20  [ТС]
Огромное спасибо!

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

Добавлено через 15 минут
+ форма не отображается в игре ;(
0
 Аватар для es_
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
19.03.2014, 09:23
Исправить баг и
А возможно сделать так, чтобы форма не выходила на панель управления(Там, где кнопки Закрыть, развернуть, скрыть)?
можно,вот код поправил:
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
 Аватар для Excelike
1 / 1 / 1
Регистрация: 20.02.2014
Сообщений: 77
19.03.2014, 12:11  [ТС]
Цитата Сообщение от es_ Посмотреть сообщение
Ещё поищите инфу, мб найдёте, как выводится программа fraps в играх
Fraps именно РИСУЕТ, а не накладывает какую либо форму ...вообщем забил я на это дело
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2014, 12:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru