Текущий архив: 2002.09.26;
Скачать: CL | DM;
ВнизВопрос для Мастеров. На засыпку. Найти похожие ветки
← →
Shrek (2002-09-13 21:06) [0]Значить так:
Имеется некийHandle
окошка (TEdit
) мне надо взять снего текст,GetWindowText
- текста не достаёт, пусто.GetWindowTextLength
- показывает 0. Остайотся только используяSendMessage(Handle, WM_COPY, 0, 0);
скопировать текст в буфер, но для этого нужно текст в окне виделить.
Вопрос! Как виделить текст в окне;
Пробывал такое:SendMessage(Handle, LB_SELECTSTRING, 0, 0);
и такоеSendMessage(Handle, CB_SELECTSTRING, 0, 0);
на большое меня не хватило.
Handle
окошка беру при помощиGetFocus
предварительно используяAttachThreadInput
.
Принимаются любые мисли касающееся темы.
За рание Благодарен.
← →
TTCustomDelphiMaster (2002-09-13 21:22) [1]Очевидно вы находите handle не того окна.
← →
Esu (2002-09-13 21:30) [2]procedure TForm1.Button1Click(Sender: TObject);
var
buff : array[0..255] of char;
begin
GetWindowText(edit1.Handle, buff, 255);
ShowMessage(buff);
end;
работает... Видимо действительно не то окно
← →
Shrek (2002-09-13 21:31) [3]Нет исключено! В некоторых случаях работает нормально.
← →
Shrek (2002-09-13 21:39) [4]
> Esu
Нет Вы не понимаете, это Edit совсем другой формы.
Для чего би я тогда использовалAttachThreadInput.
Читайте вопрос.
Ввашем примере я бы сделал так Edit.CopyToClipboard;
← →
TTCustomDelphiMaster (2002-09-13 21:40) [5]Shrek © (13.09.02 21:31)
А вы все таки проверьте, тот это handle или не тот.
← →
Shrek (2002-09-13 21:49) [6]
> TTCustomDelphiMaster
Поверте мне я бы не писал не форум если бы не был уверен 100%.
Я кликаю на то окошко, нажимаю клавишы которые обрабативает моя программа, GetFocus мне берёт handle потом нажимаю на кнопку и выполняю ShowWindow(handle, WM_HIDE); окна невидно, потом ShowWindow(handle, WM_SHOW); оно на месте.
Думаю теперь Вам ясно.
Ми зря теряем время. Может у Вас есть другая мисль?
← →
Song (2002-09-13 22:00) [7]Не надо никаких AttachTread..
Находите через FindWindowEx() и всё получится.
← →
Shrek (2002-09-13 22:08) [8]Да не надо мне handle.
Мне надо скопировать текст с окна в буфер.
Возможно Золотов бы разобрался сразу.
Мне хочется плакать.
Такой простой вопрос для Мастеров и не получается.
← →
TTCustomDelphiMaster (2002-09-13 22:11) [9]Shrek © (13.09.02 21:49)
Вот такая информация к размышлению:
GetWindowText
...
This function cannot retrieve the text of an edit control in another application.
Remarks
If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to be sent to the specified window or control. If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string. This behavior is by design. It allows applications to call GetWindowText without hanging if the process that owns the target window is hung. However, if the target window is hung and it belongs to the calling application, GetWindowText will hang the calling application.
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.
← →
Song (2002-09-13 22:15) [10]>>Да не надо мне handle.
Ну дык а что Вы хотите сказать что GetWindowText, WM_GETTEXT, WM_COPY и любого другого сообщения не нужно знать дискриптор окна?
Тут и разбираться нечего, просто Вам нужно дойти самому, чтобы потом больше не спрашивать.
← →
Shrek (2002-09-13 22:24) [11]
> TTCustomDelphiMaster
GetWindowText почемуто с окна этой программы не берёт текста.
Но сдругих окон нормально.
> Song
Есть у меня этот handle но друним путём самим оптимальным для меня.
А вот на щёт WM_GETTEXT надо подумать.
← →
Song (2002-09-13 22:32) [12]Вот здесь помнится я когда-то писал пример как выдрать из блокнота текст: http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1029670672;start=5
← →
Song (2002-09-13 22:35) [13]Вы думаете прикреплять чужой процесс только лишь для того чтобы использовать GetFocus - есть оптимальный способ?
← →
Shrek (2002-09-13 22:43) [14]А как Вы предлагаете использовать WM_GETTEXT - это ново для меня.
Если можно реальный пример.
> Вы думаете прикреплять чужой процесс только лишь для того
> чтобы использовать GetFocus - есть оптимальный способ?
Да я понимаю, но поверте, что для меня это так.
← →
Shrek (2002-09-13 22:56) [15]Стоп не надо пример.
← →
Aldokhin_Alex (2002-09-16 09:42) [16]Мужики, по-моему EM_GETLINE вам должен помочь. Работает гораздо быстрее, чем через клипбоард. И надежнее. Если кто хочет подробности - расскажу. А WM_GETTEXT действительно глухо, это вообще не из той оперы.
← →
Aldokhin_Alex (2002-09-16 09:51) [17]Извините, я хотел сказать, глухо не про WM_GETTEXT, а про GETWINDOWTEXT. :-) Сорри, поторопился.
← →
Shrek (2002-09-16 15:28) [18]
> Aldokhin_Alex
> Если кто хочет подробности - расскажу
Если тебя не затруднит.
← →
Song (2002-09-16 15:43) [19]Дык чего, до сих пор не получилось? :)
← →
Shrek (2002-09-16 16:00) [20]У меня был выходной! :)
Этот компонен очень интересный, hanlder у нево есть, но поработать сним через hanlder не совсем получается, компонент как-буто сложон из двух правда можно все коипоненты спрятат, но при попытке показать снова форма плохо работает.
В принцыипе я думал возможно проблема в том что это база даных Аксеса, форма создаётся им же, поработал сним я обнаружил ряд ошибок: текст можно вставить только из буфера, взять текст из компонента не льзя. Возможно это дело в Аксесе.
← →
Юрий Зотов (2002-09-16 21:46) [21]Ох, какие дебаты... Из-за чего, спрашивается? Из-за стандартной задачи с давно известным решением?
1. GetForegroundWindow, FindWindowEx, GetWindow - позволяют найти хэндл Edit"а без всяких заморочек с AttachThreadInput.
2. WM_GETTEXT(LENGTH) - позволяют взять его текст без всяких Clipboаrd"ов (не надо портить информацию бедняги юзера, ему своих проблем хватает).
3. По поводу GetWindowText уже было сказано - работает только для своего процесса.
← →
Kibitzer (2002-09-16 22:06) [22]Хочу сделать маленькое замечание (только для WinNT): Если у какого-нибудь
TEdit
PasswordChar<>#0
, то невозможно получить его текст отправляя ему сообщение типаSendMessage(EditHandle, WM_GETTEXT, 255, Integer(pc))
из другого приложения, хотя в том же приложении (даже из другой формы !) прекрасно работает (правда я не понял почему - может мастера объяснят).
Кроме того если уTEdit
PasswordChar=#0
, то можно "удалённо" установить какой-нибудьPasswordChar
послав сообщение:SendMessage(EditHandle, EM_SETPASSWORDCHAR, Ord("#"), 0)
, но вернуть назад (или установить другой символ) - облом :-/
← →
Song (2002-09-16 22:29) [23]Ребят, не парьтесь, у него наконец-то всё хорошо получилось.
← →
Shrek (2002-09-16 23:28) [24]Благодаря
> Song
Всё получилось прекрасно.
var
Text: array [1..$FF] of Char;
SendMessage(handler, WM_GETTEXT, SizeOf(Text), Integer(@Text));
> Юрий Зотов
Речь не шла о handler-e.
Вы сами показали мне - AttachThreadInput.
GetWindowText а вот это уже на верно - берёт он текст, прада не всегда.
Страницы: 1 вся ветка
Текущий архив: 2002.09.26;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.009 c