Форум: "WinAPI";
Текущий архив: 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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c