Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 02.06.08 06:05
Оценка:
Всем добрый день! У меня стоит задача получить текст коммандной строки автокада. Нашёл окно ком строки посылаю ему сообщение WM_GETTEXT приходит всё кроме 2ух последних строк....

делаю примерно следующие
function GetAcadCmdLine(AcadWnd:HWND):WideString ; stdcall; 
    var cmdText:array [0..15999] of Char;//это конечно не красиво.... но пока так 
    //*************************************************************** 
    function EnumChildProc(Wnd:HWND;lParam:LongInt):boolean; stdcall; 
        var wndText:array [0..15999] of Char; 
    begin 
        if lParam<>0 then 
            Result:=false 
        else 
        begin 
            //SendMessage(Wnd,WM_GETTEXT,1600,integer(@wndText)); 
            //if (Pos(' ',AnsiUpperCase(wndText))>0)then 
            GetWindowText(Wnd,wndText,255); 
            if (AnsiContainsText(wndText,'MountTam')) then 
                CommandWnd:=Wnd; 
            Result:=true; 
        end; 
    end; 
    //*************************************************************** 
begin 
    CommandWnd:=0; 
    EnumChildWindows(AcadWnd,@EnumChildProc,CommandWnd); 
    if CommandWnd<>0 then 
    begin 
        SendMessage(CommandWnd,WM_GETTEXT,16000,LPARAM(integer(@cmdText))); 
        Result:=cmdText; 
    end; 
end;

заранее спасибо!!!!
Добавлена разметка и табуляция — Кодт
Re: Проблема с получением текста из другого окна.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.06.08 07:17
Оценка:
Это многостроковый эдит? Из него текст, вроде, получают по строкам.

1. Получается количество строк: SendMessage(hEdit, EM_GETLINECOUNT, 0, 0)
2. Для каждой строки получается её длина: SendMessage(hEdit, EM_LINELENGTH, i, 0)
3. Получается значение каждой строки: SendMessage(hEdit, EM_GETLINE, i, (LPARAM)dest_buf)
Re[2]: Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 02.06.08 07:35
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Это многостроковый эдит? Из него текст, вроде, получают по строкам.


N>1. Получается количество строк: SendMessage(hEdit, EM_GETLINECOUNT, 0, 0)

N>2. Для каждой строки получается её длина: SendMessage(hEdit, EM_LINELENGTH, i, 0)
N>3. Получается значение каждой строки: SendMessage(hEdit, EM_GETLINE, i, (LPARAM)dest_buf)

Да там както не понятно, например содержимое командной строки следующее

Файл настройки загружен успешно. Группа настройки: ACAD
Файл настройки загружен успешно. Группа настройки: CUSTOM
Выполняется регенерация модели.
Утилиты меню AutoCAD загружены.
Команда: КОМСТР

Функция возвращает следующее

'Файл настройки загружен успешно. Группа настройки: ACADФайл настройки загружен успешно. Группа настройки: CUSTOMВыполняется регенерация модели.'


получается что 2 последние строки туда не попадают.
Спасибо за совет буду пробывать!!
Re: Проблема с получением текста из другого окна.
От: Pavel Dvorkin Россия  
Дата: 02.06.08 10:58
Оценка:
Здравствуйте, Answer_i3, Вы писали:

A_>GetWindowText(Wnd,wndText,255);


Гм... А может, там больше, чем 255 символов ?
With best regards
Pavel Dvorkin
Re[2]: Проблема с получением текста из другого окна.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.06.08 11:17
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Гм... А может, там больше, чем 255 символов ?


Судя по примеру, это не важно. В данном случае происходит поиск окна — он завершается успешно.
Re[3]: Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 02.06.08 11:31
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Гм... А может, там больше, чем 255 символов ?


N>Судя по примеру, это не важно. В данном случае происходит поиск окна — он завершается успешно.


Именно так, тут я ищу окно по заголовку...
Nuzhny последовал вашему совету, чтото странно у меня тут получается

cnt:=SendMessage(CommandWnd, EM_GETLINECOUNT, 0,0 );
возвращает 0, 0_о , хотя в хелпе написано что SendMessage(CommandWnd, EM_GETLINECOUNT, 0,0 ); возвращает значение не меньше 1.
Re[4]: Проблема с получением текста из другого окна.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.06.08 11:41
Оценка:
Тогда данное окно не edit. Попробуй узнать название класса окна (GetClassName) — узнаешь точно с чем имеешь дело.
Re[5]: Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 02.06.08 12:43
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Тогда данное окно не edit. Попробуй узнать название класса окна (GetClassName) — узнаешь точно с чем имеешь дело.


получаю пустую строку.. посмотрел утилиткой получил следующее Afx:00400000:8:00010013:00000000:00000000
Re[6]: Проблема с получением текста из другого окна.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.06.08 12:59
Оценка:
Здравствуйте, Answer_i3, Вы писали:

A_>получаю пустую строку.. посмотрел утилиткой получил следующее Afx:00400000:8:00010013:00000000:00000000


Мда. Какой-то MFC'шный контрол. Ещё бы узнать точно какой...
Re: Проблема с получением текста из другого окна.
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.06.08 13:42
Оценка:
"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2972843@news.rsdn.ru...
> Всем добрый день! У меня стоит задача получить текст коммандной строки автокада. Нашёл окно ком строки посылаю ему сообщение WM_GETTEXT приходит всё кроме 2ух последних строк....
>
> делаю примерно следующие
>
> function GetAcadCmdLine(AcadWnd:HWND):WideString ; stdcall;
> var cmdText:array [0..15999] of Char;//это конечно не красиво.... но пока так
> //***************************************************************
> function EnumChildProc(Wnd:HWND;lParam:LongInt):boolean; stdcall;
> var wndText:array [0..15999] of Char;
> begin
> if lParam<>0 then
> Result:=false
> else
> begin
> //SendMessage(Wnd,WM_GETTEXT,1600,integer(@wndText));
> //if (Pos(' ',AnsiUpperCase(wndText))>0)then
> GetWindowText(Wnd,wndText,255);
> if (AnsiContainsText(wndText,'MountTam')) then
> CommandWnd:=Wnd;
> Result:=true;
> end;
> end;
> //***************************************************************
> begin
> CommandWnd:=0;
> EnumChildWindows(AcadWnd,@EnumChildProc,CommandWnd);
> if CommandWnd<>0 then
> begin
> SendMessage(CommandWnd,WM_GETTEXT,16000,LPARAM(integer(@cmdText)));
> Result:=cmdText;
> end;
> end;
>
> заранее спасибо!!!!
WM_GETTEXT может и не работать через границы процессов. Нужно внедрять DLL в чужой процесс чтобы гарантировано вынуть текст.
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[6]: Проблема с получением текста из другого окна.
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.06.08 13:42
Оценка:
"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973368@news.rsdn.ru...
> Здравствуйте, Nuzhny, Вы писали:
>
> N>Тогда данное окно не edit. Попробуй узнать название класса окна (GetClassName) — узнаешь точно с чем имеешь дело.
>
> получаю пустую строку.. посмотрел утилиткой получил следующее Afx:00400000:8:00010013:00000000:00000000
RealGetWindowClass(...);
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[2]: Проблема с получением текста из другого окна.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.06.08 13:47
Оценка:
Здравствуйте, Carc, Вы писали:

C>WM_GETTEXT может и не работать через границы процессов. Нужно внедрять DLL в чужой процесс чтобы гарантировано вынуть текст.


С каких это пор?
Re[3]: Проблема с получением текста из другого окна.
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.06.08 15:06
Оценка:
"Nuzhny" <32351@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973454@news.rsdn.ru...
> Здравствуйте, Carc, Вы писали:
>
> C>WM_GETTEXT может и не работать через границы процессов. Нужно внедрять DLL в чужой процесс чтобы гарантировано вынуть текст.
>
> С каких это пор?
На XP проверьте с "мелкими" правами....
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[4]: Проблема с получением текста из другого окна.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 03.06.08 05:18
Оценка:
Здравствуйте, Carc, Вы писали:

C>На XP проверьте с "мелкими" правами....


Т.е. прав не хватает? Так это проблема не WM_GETTEXT.
Re[5]: Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 03.06.08 06:08
Оценка:
Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё!
Re[5]: Проблема с получением текста из другого окна.
От: Carc Россия http://www.amlpages.com/home.php
Дата: 03.06.08 10:50
Оценка:
"Nuzhny" <32351@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973949@news.rsdn.ru...
> Здравствуйте, Carc, Вы писали:
>
> C>На XP проверьте с "мелкими" правами....
>
> Т.е. прав не хватает? Так это проблема не WM_GETTEXT.
Абсолютно правы... Но в пылу отладки WM_GETTEXT об этом частенько забывают
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[6]: Проблема с получением текста из другого окна.
От: Carc Россия http://www.amlpages.com/home.php
Дата: 03.06.08 10:50
Оценка:
"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973984@news.rsdn.ru...
> Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё!
Для начала нужно точно убедиться что окно именно то самое... Хотя бы через те же RealGetWndClass, GetClassName, Spy++ посмотреть... Может и не нужно с внедрением DLL огород городить, просто где-то банальная ошибка.
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[7]: Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 03.06.08 11:17
Оценка:
Здравствуйте, Carc, Вы писали:


C>"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973984@news.rsdn.ru...

>> Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё!
C>Для начала нужно точно убедиться что окно именно то самое... Хотя бы через те же RealGetWndClass, GetClassName, Spy++ посмотреть... Может и не нужно с внедрением DLL огород городить, просто где-то банальная ошибка.

Окно то, в Spy++ его и искал, и удаётся же получить хоть часть тескта, но без двух последних строк
Re[6]: Проблема с получением текста из другого окна.
От: Answer_i3  
Дата: 03.06.08 11:18
Оценка:
Здравствуйте, Carc, Вы писали:


C>"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973984@news.rsdn.ru...

>> Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё!
C>Для начала нужно точно убедиться что окно именно то самое... Хотя бы через те же RealGetWndClass, GetClassName, Spy++ посмотреть... Может и не нужно с внедрением DLL огород городить, просто где-то банальная ошибка.

Окно то, в Spy++ его и искал, и удаётся же получить хоть часть тескта, но без двух последних строк
Re[3]: Проблема с получением текста из другого окна.
От: Pavel Dvorkin Россия  
Дата: 04.06.08 03:47
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Гм... А может, там больше, чем 255 символов ?


N>Судя по примеру, это не важно. В данном случае происходит поиск окна — он завершается успешно.


При чем тут поиск окна ?

int GetWindowText( HWND hWnd,
LPTSTR lpString,
int nMaxCount
);

Так что при этом вызове

A_>GetWindowText(Wnd,wndText,255);



больше, чем 255 символов и не вернут.
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.