Всем добрый день! У меня стоит задача получить текст коммандной строки автокада. Нашёл окно ком строки посылаю ему сообщение 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);
больше, чем 255 символов и не вернут.
With best regards
Pavel Dvorkin
Re[4]: Проблема с получением текста из другого окна.
Здравствуйте, Answer_i3, Вы писали:
A_>делаю примерно следующие A_>
A_>function GetAcadCmdLine(AcadWnd:HWND):WideString ; stdcall;
A_> var cmdText:array [0..15999] of Char;//это конечно не красиво.... но пока так
A_> //***************************************************************
A_> function EnumChildProc(Wnd:HWND;lParam:LongInt):boolean; stdcall;
A_> var wndText:array [0..15999] of Char;
A_> begin
A_> if lParam<>0 then
A_> Result:=false
A_> else
A_> begin
A_> //SendMessage(Wnd,WM_GETTEXT,1600,integer(@wndText));
A_> //if (Pos(' ',AnsiUpperCase(wndText))>0)then
A_> GetWindowText(Wnd,wndText,255);
A_> if (AnsiContainsText(wndText,'MountTam')) then
A_> CommandWnd:=Wnd;
A_> Result:=true;
A_> end;
A_> end;
A_> //***************************************************************
A_>begin
A_> CommandWnd:=0;
A_> EnumChildWindows(AcadWnd,@EnumChildProc,CommandWnd);
A_> if CommandWnd<>0 then
A_> begin
A_> SendMessage(CommandWnd,WM_GETTEXT,16000,LPARAM(integer(@cmdText)));
A_> Result:=cmdText;
A_> end;
A_>end;
A_>
A_>заранее спасибо!!!!
а кстати, интересно вот тут :
A_> if (AnsiContainsText(wndText,'MountTam')) then
A_> CommandWnd:=Wnd;
A_> Result:=true;
может все таки:
A_> if (AnsiContainsText(wndText,'MountTam')) then
A_> lParam:=Wnd;
A_> Result:=true;
и еще:
A_> function EnumChildProc(Wnd:HWND;var lParam:LongInt):boolean; stdcall;
но это так..не по сути, но может из-за этого навелось неверное поведение?
Re[3]: Проблема с получением текста из другого окна.
Здравствуйте, Answer_i3, Вы писали:
A_>Да там както не понятно, например содержимое командной строки следующее
A_>Файл настройки загружен успешно. Группа настройки: ACAD A_>Файл настройки загружен успешно. Группа настройки: CUSTOM A_>Выполняется регенерация модели. A_>Утилиты меню AutoCAD загружены. A_>Команда: КОМСТР
Да и вообще интересно как то получается..
в EnumChildProc окно находится как содержащее текст "MountTam"
А в основной функции это же окно "должно иметь текст" командной строки..тут либо пояснения нужны,
что код не полный (EnumChildWindows выполняется где-то в начале, а текст командной строки читается
в другом месте позже), либо вы что-то напутали в приведенном коде, может упустили что-то, из-за чего
и не видно ошибки?
Удачи!
Re[2]: Проблема с получением текста из другого окна.
От:
Аноним
Дата:
04.06.08 05:49
Оценка:
Здравствуйте, IDr, Вы писали:
IDr>а кстати, интересно вот тут : IDr>
A_>> if (AnsiContainsText(wndText,'MountTam')) then
A_>> CommandWnd:=Wnd;
A_>> Result:=true;
IDr>
IDr>может все таки: IDr>
A_>> if (AnsiContainsText(wndText,'MountTam')) then
A_>> lParam:=Wnd;
A_>> Result:=true;
IDr>
IDr>и еще: IDr>
A_>> function EnumChildProc(Wnd:HWND;var lParam:LongInt):boolean; stdcall;
IDr>
if (AnsiContainsText(wndText,'MountTam')) then
CommandWnd[/b]:=Wnd;
Result:=true; IDr>[/pascal]
CommandWnd это глобальная переменная — hwnd командной строки,его я нахожу верно
function EnumChildProc(Wnd:HWND;var lParam:LongInt):boolean; stdcall; если делаю так то велетает Access Vailation.