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

Вниз

Нажать программно кнопку   Найти похожие ветки 

 
sensor   (2004-08-01 05:58) [0]

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


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

Типа такого?

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


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

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

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.

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


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

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

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

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


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

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


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

Dimaxx   (01.08.04 11:42) [4]

;)) !!!


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

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


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

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


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

2 sensor:

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


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

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


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

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


 
nikkie ©   (2004-08-02 01:32) [11]

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

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

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

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

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


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

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


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

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


 
GrayFace ©   (2004-08-04 11:25) [14]

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

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

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.068 c
1-1093890542
Arcady
2004-08-30 22:29
2004.09.19
как справиться с генератором тестов


4-1089209190
RapTor
2004-07-07 18:06
2004.09.19
Помогите победить тетю клаву


14-1093000180
Soft
2004-08-20 15:09
2004.09.19
Задачка по ОТО(для тех кто знает физику).


14-1093513216
Layner
2004-08-26 13:40
2004.09.19
Какие есть переодические журналы для программиста?


4-1091446430
djon007
2004-08-02 15:33
2004.09.19
Кэш