Всем добрый день! У меня стоит задача получить текст коммандной строки автокада. Нашёл окно ком строки посылаю ему сообщение 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;
Это многостроковый эдит? Из него текст, вроде, получают по строкам.
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]: Проблема с получением текста из другого окна.
Здравствуйте, 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)
Да там както не понятно, например содержимое командной строки следующее
Здравствуйте, 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]: Проблема с получением текста из другого окна.
"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 в чужой процесс чтобы гарантировано вынуть текст.
"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973368@news.rsdn.ru... > Здравствуйте, Nuzhny, Вы писали: > > N>Тогда данное окно не edit. Попробуй узнать название класса окна (GetClassName) — узнаешь точно с чем имеешь дело. > > получаю пустую строку.. посмотрел утилиткой получил следующее Afx:00400000:8:00010013:00000000:00000000
RealGetWindowClass(...);
Здравствуйте, Carc, Вы писали:
C>WM_GETTEXT может и не работать через границы процессов. Нужно внедрять DLL в чужой процесс чтобы гарантировано вынуть текст.
С каких это пор?
Re[3]: Проблема с получением текста из другого окна.
"Nuzhny" <32351@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973454@news.rsdn.ru... > Здравствуйте, Carc, Вы писали: > > C>WM_GETTEXT может и не работать через границы процессов. Нужно внедрять DLL в чужой процесс чтобы гарантировано вынуть текст. > > С каких это пор?
На XP проверьте с "мелкими" правами....
"Nuzhny" <32351@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973949@news.rsdn.ru... > Здравствуйте, Carc, Вы писали: > > C>На XP проверьте с "мелкими" правами.... > > Т.е. прав не хватает? Так это проблема не WM_GETTEXT.
Абсолютно правы... Но в пылу отладки WM_GETTEXT об этом частенько забывают
"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973984@news.rsdn.ru... > Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё!
Для начала нужно точно убедиться что окно именно то самое... Хотя бы через те же RealGetWndClass, GetClassName, Spy++ посмотреть... Может и не нужно с внедрением DLL огород городить, просто где-то банальная ошибка.
C>"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973984@news.rsdn.ru... >> Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё! C>Для начала нужно точно убедиться что окно именно то самое... Хотя бы через те же RealGetWndClass, GetClassName, Spy++ посмотреть... Может и не нужно с внедрением DLL огород городить, просто где-то банальная ошибка.
Окно то, в Spy++ его и искал, и удаётся же получить хоть часть тескта, но без двух последних строк
Re[6]: Проблема с получением текста из другого окна.
C>"Answer_i3" <72898@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:2973984@news.rsdn.ru... >> Так как быть? у самого мысли по этому вопросу закончились, буду признателен если чтото посоветуете ещё! C>Для начала нужно точно убедиться что окно именно то самое... Хотя бы через те же RealGetWndClass, GetClassName, Spy++ посмотреть... Может и не нужно с внедрением DLL огород городить, просто где-то банальная ошибка.
Окно то, в Spy++ его и искал, и удаётся же получить хоть часть тескта, но без двух последних строк
Re[3]: Проблема с получением текста из другого окна.
Здравствуйте, Nuzhny, Вы писали:
N>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Гм... А может, там больше, чем 255 символов ?
N>Судя по примеру, это не важно. В данном случае происходит поиск окна — он завершается успешно.
При чем тут поиск окна ?
int GetWindowText( HWND hWnd,
LPTSTR lpString,
int nMaxCount
);
Так что при этом вызове
A_>GetWindowText(Wnd,wndText,255);