Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.14;
Скачать: CL | DM;

Вниз

SendMessage(MyHandle, WM_SetText, 0, Integer(TextToSet));   Найти похожие ветки 

 
Kyd   (2001-11-13 11:18) [0]

Привет Всем!
Надо ввести текст в окно. Делаю так:

procedure TForm1.Button2Click(Sender: TObject);
var
TextToSet: PChar;
begin
TextToSet:="MyText";
MyHandle:=FindWindow(nil, "MyWindow");
BringWindowToTop(MyHandle);
SendMessage(MyHandle, WM_SetText, 0, Integer(TextToSet));
end;

А текст вводится в заголовок окна.
Как ввести в само окно?


 
wHammer   (2001-11-13 11:42) [1]

Подожди, куда конкретно в окно?


 
Fellomena   (2001-11-13 12:11) [2]

Я так поняла, что текст тебе надо вводить в элемент окна а не в его заголовок.
Для этого надо получить handle самого окна, а потом того эл-та в который посылаешь сообщение:
Пример:
SendMessage(FindWindowEx(FindWindow("Shell_TrayWnd", nil),0,"Button",nil),WM_CLOSE,0,0);
Находишь handle трэя, затем ищеш handle первого эл-та класса Button. В данном случае трэй - является контейнером.
imho из примера всё ясно. Посмотри help на FindWindowEx !


 
Kyd   (2001-11-13 12:41) [3]

FindWindowEx - not supported WinNT!


 
Kyd   (2001-11-13 12:55) [4]

Куда конкретно в окно?
На все окно распахнут ЛистБокс. Вот в него-то и надо.
Дело в том, что если я делаю так:

MyHandle:=FindWindow(nil, "MyWindow");
BringWindowToTop(MyHandle);
SendMessage(MyHandle, WM_CHAR, Ord("e"), 0);

то есть посылаю символ туда, то он попадает именно по назначению, то есть
в этот самый листбокс.


 
wHammer   (2001-11-13 13:01) [5]

Скорее всего, но я не уверен, символ посылается сфокусированному элементу окна, в твоем случае ListBox.
Если нет необходимости писать программулю под WinNT используй FindWindowEx, как тебе подсказала Fellomena, а если нет, то пробуй ChildWindowFromPoint, под NT работает.


 
Kyd   (2001-11-13 13:06) [6]

Именно под NT или Win2k.


 
wHammer   (2001-11-13 13:33) [7]

Для того чтобы получить handle дочернего окна формы нужно узнать его координаты:

var
hListBox : integer;
pCh : TPoint;
begin
hPusk := FindWindow(nil, "MyWindow");
{! при расчете координат необходимо добавлять размер заголовка}
pCh.x := 60;
pCh.y := 140;
hListBox := ChildWindowFromPoint(hPusk, pCh); {handle твоего ListBox"а}
{ ... }
end;


 
Donal   (2001-11-13 13:37) [8]

в любом случае, для того, чтобы добавить элемент в листбокс надо использовать LB_ADDSTRING или LB_INSERTSTRING


 
Kyd   (2001-11-13 18:21) [9]

Сделал уже все!
Разбил строку на символы и посимвольно засунул, изврат, понимаю, но как сумел, так и сделал.


 
Юрий Зотов   (2001-11-13 18:39) [10]

> Kyd

1. FindWindowEx [Now Supported on Windows NT]
Не NOT, а NOW. Есть небольшая разница, не правда ли?

2. Сделайте так, как написала Fellomena.


 
Fellomena   (2001-11-14 15:12) [11]

Не поленилась, сама вчера проверила - всё нормально работает (куда бы оно делось ;):

procedure TForm1.Button1Click(Sender: TObject);
var
TextToSet: PChar;
MyHandle: THandle;
str: PChar;
begin
str:="1.txt - Блокнот";
TextToSet:="MyText";
MyHandle:=FindWindow(nil, str);
BringWindowToTop(MyHandle);
SendMessage(FindWindowEx(MyHandle,0,"Edit",nil),WM_SetText, 0, Integer(TextToSet));
end;


Читаем help:

Remarks
For an edit control, the text is the contents of the edit control.
For a combo box, the text is the contents of the edit-control
portion of the combo box. For a button, the text is the button name.
For other windows, the text is the window title.


 
Kyd   (2001-11-14 15:39) [12]

Нет, не получилось!

Я сделал так:

MyHandle:=FindWindow(nil, PChar(handle));
BringWindowToTop(MyHandle);
StrVar:=Edit2.Text+#13;
L:=Length(StrVar);
For I:=1 to L do
begin
SendMessage(MyHandle, WM_CHAR, Ord(StrVar[I]), 0);
end;

И все работает.


 
Fellomena   (2001-11-14 15:57) [13]

Проверь какой у тебя Caption у Блокнота был .
Файл в моём случае : 1.txt
Я проверяла на Win98Se и Win2k - всё нормально !


 
Kyd   (2001-11-14 16:01) [14]

Извиняюсь, работет пример от Fellomena
Только одного я не пойму:
Как вычислить этот самый текст?
Для блокнота Edit, а для других что?
Откуда это берется? Методом научного тыка?


 
Kyd   (2001-11-14 16:07) [15]

C каптион нормально было все, просто окно было не блокнотовское.
В блокнот - вводит, а вот в другие окна - нет.
>>For other windows, the text is the window title.
А если нету у него заголовка?



 
Fellomena   (2001-11-14 16:43) [16]

2 Kyd:
1). У любого виндовского окна есть handle (кнопка, поле ввода и т.д. в виндовской инторпритации тоже окно).
2).Если тебе известен заголовок или имя оконного класса или только часть заголовка окна (например
"Netscape - " + "какой-то неизвестный URL"), то используй функцию EnumWindows() для получения
всех окон, затем вызывай функцию GetWindowsText() и GetClassName для поиска нужного окна :

type
PFindWindowStruct = ^TFindWindowStruct;
TFindWindowStruct = record
Caption : string;
ClassName : string;
WindowHandle : THandle;
end;

function EnumWindowsProc(hWindow : hWnd;
lParam : LongInt) : Bool
{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
lpBuffer : PChar;
WindowCaptionFound : bool;
ClassNameFound : bool;

begin
GetMem(lpBuffer, 255);
Result := True;
WindowCaptionFound := False;
ClassNameFound := False;

try
if GetWindowText(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
then WindowCaptionFound := true;

if PFindWindowStruct(lParam).ClassName = "" then
ClassNameFound := True else
if GetClassName(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))
> 0 then ClassNameFound := True;

if (WindowCaptionFound and ClassNameFound) then begin
PFindWindowStruct(lParam).WindowHandle := hWindow;
Result := False;
end;

finally
FreeMem(lpBuffer, sizeof(lpBuffer^));
end;
end;

function FindAWindow(Caption : string;
ClassName : string) : THandle;
var
WindowInfo : TFindWindowStruct;

begin
with WindowInfo do begin
Caption := Caption;
ClassName := ClassName;
WindowHandle := 0;
EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
FindAWindow := WindowHandle;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
TheWindowHandle : THandle;
begin
TheWindowHandle := FindAWindow("Netscape - ", "");
if TheWindowHandle = 0 then
ShowMessage("Window Not Found!") else
BringWindowToTop(TheWindowHandle);
end;





Страницы: 1 вся ветка

Текущий архив: 2002.01.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
1-42446
Hawk2
2001-12-24 16:52
2002.01.14
Объясните суть, зачем все это?


1-42517
grishaK
2001-12-26 12:54
2002.01.14
Явная загрузка dll


1-42444
Brand
2001-12-24 00:54
2002.01.14
Gif на форме


1-42494
Stexen
2001-12-25 20:42
2002.01.14
ПО-МОЕМУ интересный вопрос


14-42543
skiph
2001-11-12 08:31
2002.01.14
HTML help