Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/24: Рейтинг темы: голосов - 24, средняя оценка - 4.63
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
1

Управление калькулятором из другой программы

19.04.2011, 22:30. Просмотров 4518. Ответов 13
Метки нет (Все метки)

Здравствуйте, пишу на VC++ 2008, подскажите примерами, как управлять калькулятором из другой программы? Например сложить два числа и естественно получить результат.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2011, 22:30
Ответы с готовыми решениями:

Управление окнами другой программы
Доброго времени суток... Я сам не профи по Си++, но в СИ разбираюсь хорошо....

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

Открытие файла другой программы из программы.Косяк.
Итак, есть в программе такой кусок: system("E:\\KMPlayer\\KMPlayer.exe...

Управление значком программы в панели пуск
Здравствуйте, подскажите как можно сделать управление программой с помощью...

Подскажите с Калькулятором...
Ребят подскажите не могу понять в чем ошибка, нужно чтоб он решал в...

13
IrineK
Заблокирован
19.04.2011, 22:57 2
C++
1
system("calc");
0
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
19.04.2011, 23:37  [ТС] 3
Я спросил не как запустить, а как именно управлять им из своей проги
0
schdub
Эксперт С++
3039 / 1381 / 421
Регистрация: 19.01.2009
Сообщений: 3,700
Завершенные тесты: 1
20.04.2011, 00:33 4
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
106
107
#include <windows.h>
#include <winuser.h>
#include <cassert>
 
// в данной строке должно быть то, что написано в заголовке
// главного окна Калькулятора, у меня это "Клалькулятор Плюс"
#define CALC_TITLE "Калькулятор Плюс"
// полный путь к исполнимому файлу Калькулятора в Вашей системе
#define CALC_PATH  "C:\\WINDOWS\\system32\\calc.exe"
 
class CalcClicker
{
private:
    HWND _hwnd;               // ид главного окна калькулятора
    HWND _hBtn2;              // хендл кнопки 2
    HWND _hBtn8;              // ... 8
    HWND _hBtnMulOp;          // ... *
    HWND _hBtnEqOp;           // ... =
 
    // в данную функцию направляеются все хендлы дочерних
    // окон при опросе главного окна Калькулятора. Здесь
    // происходит фильтрация идентификатов необходимых
    // нам кнопок. Реализация: см. ниже класса.
    friend static BOOL CALLBACK enumChildWindows(HWND hwnd, LPARAM lParam);
 
public:
    CalcClicker()
        : _hwnd(0)
        , _hBtn2(0)
        , _hBtn8(0)
        , _hBtnMulOp(0)
        , _hBtnEqOp(0)
    {
        // для начала ищем окно 
        _hwnd = FindWindow(NULL, CALC_TITLE);
        if (!_hwnd)
        {
            // не удалось найти, пробуем запустить калькулятор
            // и опять пробуем искать главное окно программы
            WinExec(CALC_PATH, SW_NORMAL);
            _hwnd = FindWindow(NULL, CALC_TITLE);
            if (!_hwnd)
                // даже после попытки запуска не было обнаружено окно :(
                return;
        }
        // делаем найденное окно 
        SetForegroundWindow(_hwnd);
        // пускаем процесс опроса всех дочерних окон родительского окна калькулятора
        EnumChildWindows(_hwnd, enumChildWindows, reinterpret_cast<LPARAM>(this));
    };
 
    void do2Mul8()
    {
        // проверяем было ли найдено главное окно калькулятора
        assert(_hwnd);
        // проверяем, ищентификаторы всех ли кнопкок мы нашли
        assert(_hBtn2 && _hBtn8 && _hBtnMulOp && _hBtnEqOp);
    
        // жмем кнопку 2
        SendMessage(_hBtn2, BM_CLICK, 0, 0);
        Sleep(1000);
 
        // жмем кнопку *    
        SendMessage(_hBtnMulOp, BM_CLICK, 0, 0);
        Sleep(1000);
 
        // жмем 8-ку
        SendMessage(_hBtn8, BM_CLICK, 0, 0);
        Sleep(1000);
 
        // жмем равно
        SendMessage(_hBtnEqOp, BM_CLICK, 0, 0);
    };
};
 
// ///////////////////////////////////////////////////////////////////////// //
 
static BOOL CALLBACK enumChildWindows(HWND hwnd, LPARAM lParam)
{
    // описание функции: см. в CalcClicker
    CalcClicker* p = reinterpret_cast<CalcClicker*>(lParam);
 
    // берем текст дочернего окна
    char wndCaption[256];
    GetWindowText(hwnd, wndCaption, sizeof(wndCaption));
 
    if (!strcmp(wndCaption, "2"))
        p->_hBtn2 = hwnd;
    else if (!strcmp(wndCaption, "8"))
        p->_hBtn8 = hwnd;
    else if (!strcmp(wndCaption, "*"))
        p->_hBtnMulOp = hwnd;
    else if (!strcmp(wndCaption, "="))
        p->_hBtnEqOp = hwnd;
 
    return TRUE;
}
 
// ///////////////////////////////////////////////////////////////////////// //
 
int main (int argc, char ** argv)
{
    CalcClicker cc;
    cc.do2Mul8();
 
    return 0;
}
2
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,942
20.04.2011, 00:53 5
на всякий случай нужно изучить что такое Виндос,зачем нужны месаги и что такое окна
даже я(и думаю никто) не подскажет тебе как обратится к неактивному(незапушеному)процессу

Добавлено через 4 минуты
Цитата Сообщение от schdub Посмотреть сообщение
// для начала ищем окно
_hwnd = FindWindow(NULL, CALC_TITLE);
if (!_hwnd)
{
// не удалось найти, пробуем запустить калькулятор
// и опять пробуем искать главное окно программы
WinExec(CALC_PATH, SW_NORMAL);
нет его не запушено......
и лежит не там ..........
чаго делать будем???????????

Добавлено через 6 минут
schdub,
а завтра заказчик скажет
не хочу 2*8
а хочу 256/16
всю программу неределывать будем????
0
kravam
быдлокодер
1710 / 897 / 105
Регистрация: 04.06.2008
Сообщений: 5,553
20.04.2011, 21:15 6
Круто
0
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
21.04.2011, 20:33  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
10
11
HWND H= FindWindowA(NULL, "Калькулятор");
HWND E= FindWindowExA(H, 0, "Edit", 0);
 
SendMessage(E, WM_SETTEXT, 0, (LPARAM)"2");
PostMessage(H, WM_KEYUP, 0x6B, 0);
SendMessage(E, WM_SETTEXT, 0, (LPARAM)"2");
PostMessage(H, WM_KEYUP, 0xBB, 0);
 
char* m;
GetWindowTextW(E, (LPWSTR)m, sizeof(m));
Console::WriteLine(m);
Что не так?
зы. должно сделать 2+2
0
PB
Просто прогер
1282 / 1069 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
21.04.2011, 20:52 8
Цитата Сообщение от Getter Посмотреть сообщение
Что не так?
зы. должно сделать 2+2
Да не в тестовое поле вводи данные, а клацай по экранным кнопкам с числами и знаками.
0
Getter
2 / 2 / 0
Регистрация: 09.09.2010
Сообщений: 221
21.04.2011, 23:02  [ТС] 9
А если число большое очень? И почему он не считывает из текстового поля данные, а возвращает только тру или фолс?
0
PB
21.04.2011, 23:54
  #10

Не по теме:

Цитата Сообщение от Getter Посмотреть сообщение
И почему он не считывает из текстового поля данные
Напиши дядюшке Билли и спроси у него.

0
schdub
12.06.2011, 15:41
  #11

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
schdub,
нет его не запушено......
и лежит не там ..........
чаго делать будем???????????
...
а завтра заказчик скажет
не хочу 2*8
а хочу 256/16
всю программу неределывать будем????
ValeryS, :D. Вы комментарии почитайте для начала. Это всего лишь пример техники поиска окон и взаимодействия с контролами стороннего приложения.

0
hummer_4x4
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 94
24.08.2011, 23:09 12
Управление калькулятором из другой программы

Подскажите что не так
0
schdub
Эксперт С++
3039 / 1381 / 421
Регистрация: 19.01.2009
Сообщений: 3,700
Завершенные тесты: 1
25.08.2011, 22:37 13
hummer_4x4,
если ассертит в этом месте, то значит, что не были получены хендлы кнопок _hBtn2, _hBtn8, _hBtnMulOp, _hBtnEqOp (какой-то из них, а может все сразу) - разбирайтесь с функцией enumChildWindows(), там происходит их инициализация.

Данный код работает у меня под XP.
0
Falk35000
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 1
03.01.2016, 17:40 14
народ нужна помощь в написании управляюще проги, как узнать ид поля под заполнения в которое необходимо вводить значение и кнопок в программе, заранее спасибо
0
03.01.2016, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2016, 17:40

Помогите с функцией-калькулятором.
Господа программисты! Требуется срочная помощь:необходима...

проблема с калькулятором матриц
Задание. Вычислить матрицу С=A+B*B(транспонированную). если А(3х3),В(2х3). и...

Запуск программ из другой программы
Подскажите пожалуйста, что делаю не так. Задача следующая: Есть несколько...


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

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

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