Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Вниз

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;





Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.025 c
4-42614           SergeyDonetsk         2001-11-08 12:50  2002.01.14  
Кто поможет проверить где ошибка?


1-42438           artur                 2001-12-24 16:04  2002.01.14  
какой delphi устанавливается на win2000


6-42522           Polevi                2001-10-17 11:45  2002.01.14  
С мольбой о помощи взываю!!!


1-42398           Fast                  2001-12-24 09:59  2002.01.14  
Консольные программы


6-42538           Evgeniy_S             2001-10-16 17:53  2002.01.14  
Indy