Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нажать программно кнопку [D5, D6, D7, Win2k, WinXP]


sensor ©   (2004-08-01 05:58:00) 

Уважаемые мастера, подскажите: мне нужно нажать Enter в другом приложении (в поле Edit), как правильно?...сорец:
SendMessage(EditHandle, WM_Keydown, VK_return, 0);
не работает, что здесь не так?


GrayFace   (2004-08-04 11:25:00) [1]

nikkie ©   (02.08.04 1:32) [11]
Сомниваюсь, что может работать PostMessage и не работать SendMessage.

> в-четвертых, почему ты думаешь, что реакция будет на WM_KEYDOWN, а не на WM_KEYUP?

Естественно. Так бывает в большинстве случаев.

sensor
Попробуй слать WM_Char. Либо ставь фокус на то окно, а потом посылай WM_keyDown и WM_KeyUp и еще заполни у них LParam.


Pavel Zholudev   (2004-08-04 10:00:00) [2]

procedure TForm1.Timer1Timer(Sender: TObject);
var Hnd, HndBtn:HWND;
begin
Hnd:=FindWindow(nil,'KONICA MINOLTA PagePro 1300W');
If Hnd>0 then begin
HndBtn:=FindWindowEx(Hnd,0,'Button','Proceed');
SendMessage (HndBtn, BM_Click, 0, 0);
end;
end;//proc


Chislo Pi   (2004-08-02 10:13:00) [3]

Удалено модератором


nikkie   (2004-08-02 01:32:00) [4]

>я уже многа раз сказал, в edit послать enter.
а табе многа раз гаварят, что это enter - клавиша, а не не кнопка, во-первых.

а во-вторых, неизвестно кто и как обрабатывает обрабатывает это сообщение. singleline edit, например, никак enter не обрабатывает, но может и обрабатывать, если его сабклассировать.

в-третьих, читаем документацию:
The WM_KEYDOWN message is postedto the window with the keyboard focus when a nonsystem key is pressed.
начинаем думать, какая разница между SendMessage и PostMessage.

в-четвертых, почему ты думаешь, что реакция будет на WM_KEYDOWN, а не на WM_KEYUP?

в-пятых, есть такая функция keybd_event.


sensor   (2004-08-02 01:05:00) [5]

а, и еще есть одно, в МОЕЙ проге (т.е. на моей форме) все это работает.


sensor   (2004-08-02 00:45:00) [6]

2 dimaxx
я уже многа раз сказал, в edit послать enter.
---
сорец я кинул, какая там кнопка, када там написано че да как, тока оно не пашет


Dimaxx   (2004-08-01 23:11:00) [7]

2 sensor:

Так я не понял: надо нажать на кнопку программно или послать в edit enter? Конкретизируй, а то в сабже одно, а обсуждение идет о другом. Если кнопку нажать, так все прекрасно действует. Если надо нажать клавишу (а это совсем другое), тогда так и пиши. :-)


sensor   (2004-08-01 21:42:00) [8]

SendMessage(EditHandle, WM_Keydown, VK_return, 0);
по идее сорец правилный, в этом случае эдиту посылаеца месадж о нажатии enter'a (vk_return)... но оно не пашет.


sensor   (2004-08-01 21:40:00) [9]

Dimaxx  не пашет
Rem уверен что эдит обрабатывает энтер, в проге то другой он работает


Кириешки   (2004-08-01 12:06:00) [10]

Dimaxx   (01.08.04 11:42) [4]

;)) !!!


Dimaxx   (2004-08-01 11:42:00) [11]

А выполнить команду PostMessage(BtnHandle,BM_CLICK,0,1); религия не позволяет? :)


Rem   (2004-08-01 11:06:00) [12]

Кому же вы посылаете Enter? Edit'у? Вы уверены, что Edit обрабатывает нажатие Enter?

Как варианты, могу предложить отсылать то же сообщение:
1. Форме, на которой расположен Edit, в надежде, что у этой формы KeyPreview = true
2. Кнопке "OK", расположенной на этой форме. В данной ситуации также можно посылать MouseClick, как в [1].

Хотите точный ответ - опишите проблему шире: для чего вам надо Enter обрабатывать?


Кириешки   (2004-08-01 11:05:00) [13]

Вот программа которую делал мой племянник для нажатия на кнопки чужого приложения.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ListBox1: TListBox;
   Edit1: TEdit;
   Button2: TButton;
   Edit2: TEdit;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure ListBox1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure ClickOnForm (wnd:HWND;caption:string);
var
TheChildHandle:HWND;
begin
TheChildHandle:=FindWindowEx(wnd,0,nil,PChar(caption));
SendMessage(TheChildHandle,WM_LButtonDown,1,1);
SendMessage(TheChildHandle,WM_LButtonUP,1,1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
wnd:HWND;
caption:string;
begin
wnd:=GetTopWindow(0);
repeat
SetLength(caption,GetWindowtextLength(wnd));
GetWindowText(wnd,@caption[1],length(caption)+1);

if (trim(caption)=pchar(edit1.text)) then ClickOnForm(wnd,pchar(edit2.text));
wnd:=GetNextWindow(wnd,GW_HWNDNEXT);
until wnd=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
VAR
 Wnd : hWnd;
 buff: ARRAY [0..127] OF Char;
 i : Integer;
begin
ListBox1.Clear;
 Wnd := GetWindow(Handle, gw_HWndFirst);
 WHILE Wnd <> 0 DO BEGIN
     IF IsWindowVisible(Wnd) AND
      (GetWindow(Wnd, gw_Owner) = 0) AND
      (GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
   THEN BEGIN
     GetWindowText(Wnd, buff, sizeof(buff));
     ListBox1.items.Add(StrPas(buff));
   END;
   Wnd := GetWindow(Wnd, gw_hWndNext);
 END;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
edit1.text := pchar(listbox1.items[listbox1.itemindex]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
oncreate(sender);
end;

end.

Может поможет. Я сам такой шнягой никогда не занимался.


Кириешки   (2004-08-01 07:15:00) [14]

Типа такого?

SpeedButton1.Perform(WM_LBUTTONDOWN, 0, 0);
SpeedButton1.Perform(WM_LBUTTONUP, 0, 0);


Наверх

Титульная страница Поиск, карта сайта Написать письмо