Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
10 / 9 / 1
Регистрация: 23.11.2019
Сообщений: 159

Получить сообщение из другой программы

05.03.2022, 19:35. Показов 2095. Ответов 5

Студворк — интернет-сервис помощи студентам
Захотел сделать лабу, чтобы всё было в разных приложения и основные данные были в файлах
Но нужно, чтобы эти файлы читали, в них писали - и стоит одной из программ знать, когда можно читать из файла

Думал сделать на pipe, но препод подкинул идею(решил попробовать) SendMessage, Getmessage (супер идея день уже ответ ищу)


Как мне прочитать и отправить какое - нибудь значение: инт, бул, хоть что-нибудь, что будет знаком, что можно приступать.
Код пишу на плюсах, другой на шарпах

Вот на плюсах пытаюсь сделать приём сообщения (в строках с 41 по 50) , Хэндл проги знаю от которой принимать надо
Но проблема в том, что на цикле с Getmessage ничего не происходит в консоли - ни бесконечных сообщений "ОК", ни проход цикла мимо, всё прога замерла, что-то точно делаю не так
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<Windows.h>
#include<fstream>
#include<string>
#include<stdlib.h>
 
#ifdef _DEBUG
    #define PAUSE system("pause")
#else
    #define PAUSE
#endif
/////////////////////
////////////////////
#ifdef _DEBUG
    #define DCode(...) {__VA_ARGS__}
#else
    #define DCode(...)
#endif
 
 
 
using namespace std;
 
 
int main(int argCount, char* args[])
{
 
    if (argCount < 3)
    {
        DCode
        (
            cout << "not enough args (need 3 args)\n";
        );
        cerr << "not enough args (need 3 args)\n";
        PAUSE;
        return 1;
    }
 
 
 
    MSG msg;
    HWND hApp = (HWND)atoi(args[2]);
    DCode
    (
        cout << hApp << '\n' << args[2] << endl;
    );
    while (GetMessage(&msg, hApp, 0, 0))
    {
        cout << "ok!";
    }
 
 
    DCode
    (
        cout << args[1] << endl;
        cout << args[2] << endl;
        cout << hApp << endl;
    );
 
    ifstream fin(args[1]);
    if (!fin.is_open())
    {
        DCode
        (
            cout << "Failed to open file: " << args[1] << endl;
        );
        cerr << "Failed to open file: " << args[1] << endl;
        PAUSE;
        return 2;
    }
        
    DCode
    (
        cout << "1) Output data from file\n"
            << ">>";
        char ch;
        cin >> ch;
        if (ch == '1')
        {
            string text;
            do
            {
                getline(fin, text);
                cout << text << endl;
            } while (!fin.eof());
        }
    );
 
 
    PAUSE;
    return 0;
}




Вот вторая прога на шарпах, здесь вроде всё супер, но может быть не правильно отправляю сообщение с помощью SendMessage в строке 52.
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
 
namespace User
{
    public partial class Form1 : Form
    {
        String pathXmls = "../../../L2/";
        System.Diagnostics.Process process = new System.Diagnostics.Process();
 
 
 
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
 
        [DllImport("user32")]
        public static extern bool GetMessage(ref Message lpMsg, IntPtr handle, uint mMsgFilterInMain, uint mMsgFilterMax);
 
        public static readonly int WM_APP = 0x8000;
 
 
 
 
        public Form1()
        {
            InitializeComponent();
 
#if DEBUG
            process.StartInfo.FileName = @"..\..\..\x64\Debug\RusBase1.exe";
#else
            process.StartInfo.FileName = @"..\..\..\x64\Release/RusBase1.exe";
            process.StartInfo.CreateNoWindow = false;
            process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
#endif
 
            process.StartInfo.Arguments = @"..\..\..\loan_approval.txt ";
            process.StartInfo.Arguments += Handle.ToString();
            process.Start();
 
            Application.ApplicationExit += OnApplicationExit;
 
 
            SendMessage(process.Handle, WM_APP, (IntPtr)0, (IntPtr)0);
 
        }
 
        private void OnApplicationExit(object sender, EventArgs e)
        {
            process.Kill();
        }
 
       
    }
 
 
 
 
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2022, 19:35
Ответы с готовыми решениями:

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

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

Получить данные из другой программы
Имеется программа с EditText и записанным в в нём числом. Нужно получить это число при помощи второй программы. По другому говоря залесть в...

5
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
08.03.2022, 15:42
Не очень понятно, зачем вы в GetMessage отправляете HWND чужого окна. GetMessage извлекает сообщение из вашей оконной очереди, а не из очереди чужого окна.
0
10 / 9 / 1
Регистрация: 23.11.2019
Сообщений: 159
09.03.2022, 23:37  [ТС]
Как я понял, там второй мараметр у гет месседж указывает от какой проги я хочу получить сообщение
Да даже если так, нул вроде говорит, что надо получить любое сообщение без разницы от кого, но и так не работает
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
10.03.2022, 10:06
Лучший ответ Сообщение было отмечено DGDarkKing как решение

Решение

Цитата Сообщение от DGDarkKing Посмотреть сообщение
Как я понял, там второй мараметр у гет месседж указывает от какой проги я хочу получить сообщение
не от проги, а от контрола.
вы не до конца понимаете что такое дескриптор окна.
дескриптор окна любого котрола (TextBox, ListView, Button, Window и т.д.) это объект ядра.
чтобы его получить от другой оконной программы, вам нужно перехватить (хукнуть - получить доступ к её объектам) эту программу и отправляемые ею сообщения.
2
10 / 9 / 1
Регистрация: 23.11.2019
Сообщений: 159
10.03.2022, 12:51  [ТС]
Ох, как я надеялся, что хукать не надо - думал, что верно понял всё
Да, и вправду не так видать понял определение, которое прочитал, спасибо, что указали на это

Если я верно понимаю - если процесс будет запущен как дочерний, то у меня получится моим способом принять сообщение?
И ещё(на этот вопрос конечно поищу позже ответ, но может вы сможете раньше ответить) - когда стоит использовать хук, ведь по факту для большинства задач можно юзать разделяемые объекты(пайп, файл мапу)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
10.03.2022, 15:33
Цитата Сообщение от DGDarkKing Посмотреть сообщение
если процесс будет запущен как дочерний, то у меня получится моим способом принять сообщение?
да, у вас уже будет дескриптор процесса с полным доступом.

Цитата Сообщение от DGDarkKing Посмотреть сообщение
когда стоит использовать хук, ведь по факту для большинства задач можно юзать разделяемые объекты(пайп, файл мапу)
пайпы и другие каналы используют в большей степени при межсессионном взаимодействии.
объекты, находящиеся в одном окружении не требуют сигнальных передач, они итак доступны.

по поводу перехвата - оконное приложение для передачи/получения данных своим контролам использует сообщения.
дескрипторы этих контролов валидны только в окружении этого оконного приложения.
связь этого оконного приложения с остальной системой обеспечивается дескриптором процесса (точнее идентификатором процесса, т.к. он уникален в любой момент времени, а дескриптор процесса может быть закрыт и открыт заново).
получив доступ к дескриптору процесса, начинаете последовательно получать доступ к дескрипторам его контролов.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2022, 15:33
Помогаю со студенческими работами здесь

Как получить GetValue из другой программы
Подскажите, пожалуйста, как можно получить GetValue из другой программы, есть такой код: Assembly asm =...

Получить текст из окна другой программы
Добрый день! Подскажите как можно получить текст из стороннего приложения? Это не браузер, так что вариант парсить хтмлку, не годится.

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

Получить текст другой программы (из эдита)
Привет форум... Вот зачотел получить текст от другой программы (с едита) Так вот, делаю так { wchar_t *buf; HWND hWnd2,hWnd =...

Получить данные из другой программы из поля TVirtualDrawTree
Хочу получить список контактов из QIP до TVirtualDrawTree добраться то можно, а вот как все контакты записать в memo ? procedure...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru