Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.005 c
1-42482
TSerg
2001-12-25 15:25
2002.01.14
Можно ли имитировать нажатие какой либо клавиши?


4-42603
Русский
2001-11-09 10:29
2002.01.14
Форма


1-42478
ВС
2001-12-25 15:38
2002.01.14
Как с помощью компонента NMHTTP закачать все содержимое


3-42392
Shoo
2001-12-13 13:20
2002.01.14
Вставка записей в 2 таблицы


3-42370
Марина
2001-12-11 10:20
2002.01.14
Как использовать ADO для таблиц *.dbf





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский