Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/23: Рейтинг темы: голосов - 23, средняя оценка - 4.61
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
1

Управление программой написанной на C# другим приложением(ями)

11.08.2012, 09:49. Показов 4222. Ответов 12
Метки нет (Все метки)

Прошу предоставить примеры кода или ссылки на литературу по управлению программой написанной на C# другими приложениями.

Что собственно нужно:

1) Открыть приложение
2) Уменьшить/увеличить размер окна приложения, передвинуть окно.
3) Нажатие клавиш в приложении
4) Анализ происходящего в приложении.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2012, 09:49
Ответы с готовыми решениями:

Управление другим приложением
Допустим, мы имеем простое оконное приложение А, которое имеет падающее меню со списком цифр от 1...

управление другим приложением
Есть flash приложение в окне браузера (допустим webBrowser на форме). Так вот... програмно нажать...

Управление другим приложением!
Есть приложение (простенькая старенькая любимая игра без исходников). НЕ ПУТАТЬ С БОТОВОДСТВОМ! ...

Управление другим приложением
Добрый день. Не могу никак разобраться. У программы которой хочу управлять знаю все с помощью...

12
425 / 426 / 93
Регистрация: 16.07.2012
Сообщений: 886
11.08.2012, 11:30 2
Такую программу лучше не на C# писать. Но даже если и на C#, то все равно придется пользоваться системными функциями WinApi (через Platform Invoke).
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.08.2012, 16:40 3

Не по теме:

Цитата Сообщение от canopen Посмотреть сообщение
Такую программу лучше не на C# писать
Есть действительно значимые аргументы кроме имхо?


Цитата Сообщение от yura097 Посмотреть сообщение
Открыть приложение
Process.Start
Цитата Сообщение от yura097 Посмотреть сообщение
Уменьшить/увеличить размер окна приложения, передвинуть окно
SetWindowPos
Цитата Сообщение от yura097 Посмотреть сообщение
Нажатие клавиш в приложении
SendMessage + BM_CLICK
Цитата Сообщение от yura097 Посмотреть сообщение
Анализ происходящего в приложении
Всё зависит от того что надо анализировать...

Примеры со всеми WinAPI есть на форуме. Это если приложение не Ваше.

А если приложение Ваше, так вообще всё проще, можно просто посылать сообщения SendMessage (с WM_COPYDATA если необходимо), или использовать межпроцессное взаимодействие (пайпы, проецирование в памяти).
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
11.08.2012, 16:57  [ТС] 4
Допустим есть код

Цикл который выполняется бесконечно (нажимая цифры в другом приложении (код не полный))

C#
1
2
3
4
5
6
7
8
9
  while (true)
            {
                SendKeys.SendWait("2");
                System.Threading.Thread.Sleep(1100);
                SendKeys.SendWait("3");
                System.Threading.Thread.Sleep(1100);
                SendKeys.SendWait("4");
                System.Threading.Thread.Sleep(1820);
            }
Во-первых как более гуманно делать паузы между выполнением команд и во вторых как этот цикл красиво прервать нажатием например клавиши или другой кнопки в приложении.
0
canopen
11.08.2012, 17:04
  #5

Не по теме:

Цитата Сообщение от SSTREGG Посмотреть сообщение
Есть действительно значимые аргументы кроме имхо?
Мне казалось очевидным, что в этом случае обычный C будет лучшим выбором чем C# - хотя бы тем что не придется описывать все эти структуры и функции WinAPI, а достаточно будет заголовочные файлы подключить.То есть пару-другую простых функций импортировать проблем никаких нет конечно, а вот если их сотня будет, да еще со сложными параметрами какими-нибудь...

0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.08.2012, 17:34 6
yura097, вынести код в отдельный поток.
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
bool doWork;
 
void Button1_Click( object sender, EventArgs e )
{
    if ( doWork )
        return;
    // Запуск потока
    doWork = true;
    new Thread(DoSmth).Start();
}
 
void Button2_Click( object sender, EventArgs e )
{
    doWork = false;
}
 
void DoSmth()
{
    while (doWork)
    {
        SendKeys.SendWait("2");
        System.Threading.Thread.Sleep(1100);
        SendKeys.SendWait("3");
        System.Threading.Thread.Sleep(1100);
        SendKeys.SendWait("4");
        System.Threading.Thread.Sleep(1820);
    }
    
    doWork = false;
}

Не по теме:

Цитата Сообщение от canopen Посмотреть сообщение
хотя бы тем что не придется описывать все эти структуры и функции WinAPI
Дело пары минут на C# не более. Это не аргумент :no: Таким же образом я могу сказать про написание интерфейса на чистом WinAPI ;) Во всём есть свои + и -. Соглашусь лишь с тем что на C писать с использованием WinAPI удобней, но это не значит что C# стоит отбрасывать.

0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
11.08.2012, 17:40  [ТС] 7
У меня собственно не было проблем со способами прерывания цикла.
Проблема в том что на System.Threading.Thread.Sleep(1100); приложение виснет и ничего не выполняется. То есть пользователю не с 1 раза может удастся остановить цикл.

Из за этого и был вопрос про более гуманные паузы в цикле что бы не вешать всю программу целиком.
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.08.2012, 17:43 8
yura097, так я Вам, собственно, не только способ прерывания цикла привёл, но и вынос кода в отдельный поток, чтоб GUI не тормозило.

UPD:
Пардон, прочитал Ваше сообщение вверху и подумал про остановку потока, а надо было паузу...
canopen, верный варинат с ManualResetEvent предложил.
1
425 / 426 / 93
Регистрация: 16.07.2012
Сообщений: 886
11.08.2012, 17:45 9
Сделайте через ManualResetEvent - в основном потоке при завершении выставляйте его и ожидайте завершения фонового потока, а в фоновом вместо слипа ждите события с таймаутом равным времени паузы.
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
11.08.2012, 17:48  [ТС] 10
SSTREGG,
C#
1
Ошибка    1   Не удалось найти имя типа или пространства имен "Thread" (пропущена директива using или ссылка на сборку?
C#
1
2
3
4
5
6
7
8
9
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.Runtime.InteropServices;
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
11.08.2012, 17:59 11
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
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        bool doWork;
        bool paused;
        ManualResetEvent mrEvent;
 
        public Form1 ( )
        {
            InitializeComponent();
            mrEvent = new ManualResetEvent( true );
        }
 
        void button1_Click ( object sender, EventArgs e )
        {
            if ( doWork )
            {
                if ( paused )
                    mrEvent.Set();
                else
                    mrEvent.Reset();
 
                paused = !paused;
                return;
            }
            // Запуск потока
            doWork = true;
            paused = false;
            new Thread( DoSmth ).Start();
        }
 
        void button2_Click ( object sender, EventArgs e )
        {
            doWork = false;
 
            if ( paused )
            {
                mrEvent.Set();
                paused = false;
            }
        }
 
        void DoSmth ( )
        {
            while ( true )
            {
                mrEvent.WaitOne();
                if ( !doWork )
                    break;
                Debug.WriteLine( "CALL" );
 
                SendKeys.SendWait( "2" );
                System.Threading.Thread.Sleep( 1100 );
                SendKeys.SendWait( "3" );
                System.Threading.Thread.Sleep( 1100 );
                SendKeys.SendWait( "4" );
                System.Threading.Thread.Sleep( 1820 );
            }
        }
    }
}
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
11.08.2012, 18:15  [ТС] 12
SSTREGG, Благодарю. Думаю вариант и с паузой и со стопом понадобится.
0
F1nZeR
12.08.2012, 06:44     Управление программой написанной на C# другим приложением(ями)
  #13

Не по теме:

4) Анализ происходящего в приложении. - кхрм

0
12.08.2012, 06:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2012, 06:44
Привет! Вот еще темы с ответами:

Управление другим приложением из приложения
Есть игра "Stronghold Kingdoms", как полагается есть ресурсы, торговля и т.д... Возможно ли...

Бинарный файл, созданный одним приложением, не читается другим приложением
Добрый день. Проблема: Первое приложение создает List<MyClass> и сериализует в бинарный файл....

Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll)
Доброго времени суток!Задали лабораторную работу: программа, написанная на с++ должна подключать...

Значение, возвращаемое приложением должно быть "увидено" другим приложением
Всем привет. Подскажите пожалуйста, как после определённого события, к примеру, при нажатии на...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.