Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
Fire Man   (2003-03-04 10:15) [0]

Как програмно нажать кнопку на чужом приложении?
Желательно с исходниками, если таковые имеются!
Заранее спасибо!


 
MBo   (2003-03-04 13:24) [1]

Найти ее дескриптор (FindWindow, FindWindowEx) и послать сообщение BM_Click


 
Intell   (2003-03-05 14:40) [2]

Скажи на каком приложении, а я попробую.

sergein@nojabrsk.ru


 
Ghost_   (2003-03-05 18:26) [3]


> MBo ©

А как во его найти?

hh:=FindWindowEx(FindWindow(nil, PChar("окно")), 0, "TButton",nil);
так чегото не получается;


 
Style   (2003-03-06 09:28) [4]

Сначала просто найди окно приложения

Handle := FindWindow(Class,Title);

Если надо найти Другие (не главные)окна в твоем приложении
Используй EnumWindows

Зная хэндл окна. юзаешь функцию

HWND GetDlgItem(

HWND hDlg, // handle of dialog box
int nIDDlgItem // identifier of control
);

Получаешь Handle кнопки и отправляешь ей сообщение
BM_Click

Handle кнопки можешь проверить функцией WindowFromPoint(координата кнопки)

P.S. Удачи


 
Acidy   (2003-03-06 11:17) [5]

В пакетах Visual Studio есть прога , называется WinSpy++ ....
Она показывает все имена классов окон в системе, в ней видать все дочерние.....
В общем еси чё надо (прогу эту или кусок кода с примером пиши здесь на форуме) сделаем.... :)
С уважением, Acidy


 
Ghost_   (2003-03-06 14:01) [6]

Я просто не совсем понимаю..как они в окне ищутся я никогда такого не делал и надеялся, что не придется...мне нужно ввести пароль в диалог чужого окна..и нажать кнопку ОК тоесть я
SendMessage(FindWindowEx(FindWindow(nil, PChar("ВВеди пароль")),
0, nil, nil), WM_SETTEXT, 0, Integer(@Str));
я пароль добавил все правильно соответственно окно нашел..осталось нажать кнопку...


 
Style   (2003-03-06 14:04) [7]

Смотри функцию

HWND GetDlgItem(

HWND hDlg, // handle of dialog box
int nIDDlgItem // identifier of control
);

найдешь кнопку!


 
Ghost_   (2003-03-06 14:46) [8]

а хоть примерно как это пишется
hh:=GetDlgItem(FindWindow(nil, PChar("Окно")),?);


 
Style   (2003-03-06 15:22) [9]

Вот кусок кода я давненько делал

//TDlgControl - TaskWindow Controls
TDlgControl = class(TObject)
private
FName: String;
FOwner: pointer;
FClassName: String;
FHandle: HWND;
FDlgID: integer;
FText: String;
FWidth: integer;
FHeight: integer;
FTop: integer;
FLeft: integer;
procedure SetLeft(Value: integer);
procedure SetTop(Value: integer);
procedure SetWidth(Value: integer);
procedure SetHeight(Value: integer);
public
property Name: String read FName write FName;
property AClassName: String read FClassName write FClassName;
property Handle: HWND read FHandle write FHandle;
property DlgID: integer read FDlgID write FDlgID;
property Text: String read FText write FText;

property Width: integer read FWidth write SetWidth;
property Height: integer read FHeight write SetHeight;
property Top: integer read FTop write SetTop;
property Left: integer read FLeft write SetLeft;

property Owner: pointer read FOwner write FOwner;

function GetText: string;
procedure SetText(Value: string);
procedure RePosition;
procedure SetFocus;
constructor Create(pOwner: pointer; ControlWnd:HWND);
destructor Destroy; override;
end;
//TTaskWindow
TTaskWindow = class(TObject)
private
FCaption: String;
FClassName: String;
FControls: TStringList;
FHandle: HWND;
FWidth: integer;
FHeight: integer;
FTop: integer;
FLeft: integer;
procedure SetLeft(Value: integer);
procedure SetTop(Value: integer);
procedure SetWidth(Value: integer);
procedure SetHeight(Value: integer);
procedure SetCaption(Value: string);
public
property Caption: String read FCaption write SetCaption;
property AClassName: String read FClassName write FClassName;
property Controls: TStringList read FControls write FControls;
property Handle: HWND read FHandle write FHandle;
property Width: integer read FWidth write SetWidth;
property Height: integer read FHeight write SetHeight;
property Top: integer read FTop write SetTop;
property Left: integer read FLeft write SetLeft;

constructor Create;
destructor Destroy; override;

procedure RePosition;
procedure LoadControls;
function ControlByName(Name: string): TDlgControl;
function Find(Caption,ClassN :string): boolean;
end;

function TTaskWindow.Find(Caption,ClassN :string): boolean;
var
FindWnd: TFindWindowStruct;
Rect: TRect;
begin
FindWnd.WindowHandle := 0;
FindWnd.Caption := Caption;
FindWnd.ClassName := ClassN;
EnumWindows(@EnumWindowsProc,Longint(@FindWnd));

if(FindWnd.WindowHandle <> 0) then
begin
FHandle := FindWnd.WindowHandle;
FClassName := FindWnd.ClassName;
FCaption := FindWnd.Caption;
GetWindowRect(FHandle,Rect);
FTop := Rect.Top;
FLeft := Rect.Left;
FWidth := Rect.Right - Rect.Left;
FHeight := Rect.Bottom - Rect.Top;
result := true;
end
else
begin
result := false;
end;
end;

procedure TTaskWindow.LoadControls;
var
NameObject: TNameGenerate;
DlgControl:TDlgControl;
ControlWnd: HWND;
i,FID,CID: integer;
ClassList: TStringList;
begin
ClassList := TStringList.Create;

ControlWnd := GetNextDlgGroupItem(FHandle,0,false);
FID := GetDlgCtrlID(ControlWnd);
CID := 0;
while(CID <> FID) do
begin
ControlWnd := GetNextDlgGroupItem(FHandle,ControlWnd,false);
//Begin
DlgControl := TDlgControl.Create(self,ControlWnd);

if(ClassList.IndexOf(DlgControl.AClassName) = -1) then
begin
NameObject := TNameGenerate.Create;
NameObject.AClassName := DlgControl.AClassName;
NameObject.NameCount := 1;
DlgControl.Name := DlgControl.AClassName + IntToStr(NameObject.NameCount);
ClassList.AddObject(NameObject.AClassName,NameObject);
end
else
begin
TNameGenerate(ClassList.Objects[ClassList.IndexOf(
DlgControl.AClassName)]).NameCount :=
TNameGenerate(ClassList.Objects[ClassList.IndexOf(
DlgControl.AClassName)]).NameCount + 1;
DlgControl.Name := DlgControl.AClassName + IntToStr(
TNameGenerate(ClassList.Objects[ClassList.IndexOf(
DlgControl.AClassName)]).NameCount);
end;
CID := GetDlgCtrlID(ControlWnd);
Controls.AddObject(DlgControl.Name ,DlgControl);
end;

for i:=0 to ClassList.Count-1 do
begin
ClassList.Objects[i].Free;
end;
ClassList.Free;
end;

function TTaskWindow.ControlByName(Name: string): TDlgControl;
begin
if(FControls.IndexOf(Name) <> -1) then
begin
result := TDlgControl(FControls.Objects[FControls.IndexOf(Name)]);
end
else
begin
result := nil;
end
end;


 
Style   (2003-03-06 15:24) [10]

Чуть не забыл :)

function EnumWindowsProc(hWindow : hWnd;
lParam : LongInt) : Bool
{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
lpBuffer1: PChar;
lpBuffer2: PChar;
CaptionFound,ClassFound: boolean;
begin
GetMem(lpBuffer1, 255);
GetMem(lpBuffer2, 255);
Result := True;
CaptionFound := false;
ClassFound := false;
try
GetWindowText(hWindow, lpBuffer1, 255);
GetClassName(hWindow, lpBuffer2, 255);

if(PFindWindowStruct(lParam).Caption = "") then CaptionFound := true;
if(PFindWindowStruct(lParam).ClassName = "") then ClassFound := true;

if (StrPas(lpBuffer1) = PFindWindowStruct(lParam).Caption) and (not CaptionFound) then
begin
CaptionFound := true;
end;
if (StrPas(lpBuffer2) = PFindWindowStruct(lParam).ClassName) and (not ClassFound) then
begin
ClassFound := true;
end;
if(ClassFound and CaptionFound) then
begin
PFindWindowStruct(lParam).Caption := StrPas(lpBuffer1);
PFindWindowStruct(lParam).ClassName := StrPas(lpBuffer2);
PFindWindowStruct(lParam).WindowHandle := hWindow;
Result := false;
end;
finally
FreeMem(lpBuffer2, sizeof(lpBuffer2^));
FreeMem(lpBuffer1, sizeof(lpBuffer1^));
end;
end;


 
aleksey_sv   (2003-03-06 15:26) [11]

sendmessage(hwch,WM_SYSCOMMAND,BM_CLICK,0);
где hwch Хендл кнопки.


 
aleksey_sv   (2003-03-06 15:29) [12]

Кнопка находится так
hw:=Findwindow(Класс окна,Заголовок окна);
hwch:=findwindowEx(hw,0,nil,Заголовок кнопки);


 
Style   (2003-03-06 15:31) [13]

>> aleksey_sv

Ну а если ты незнаешь заголовок?? :)
Я просто делал из этого компонент для доступа к другой форме


 
aleksey_sv   (2003-03-06 15:35) [14]


> Style

Я расчитывал на то что он знает заголовок так как он сам сказал что всё остальное уже сделал


 
Style   (2003-03-06 15:36) [15]

>> aleksey_sv

ксати FindWindowEX -> [Now Supported on Windows NT]
соответственно 2000, XP

Как это можно юзать????
Поэтому я и делал GetDlgItem


 
Style   (2003-03-06 15:37) [16]

>> aleksey_sv :))) Sorry опять я перепутал Вечно путаю Now и Not


 
aleksey_sv   (2003-03-06 15:46) [17]


> Style

Странно, столько прог в 2000 на делал с FindWindowEx и они почемуто работают нормально :(


 
Style   (2003-03-06 15:49) [18]

>> aleksey_sv... Поторопился.. извени... :) Гючит наверное уже слово Now с Not перепутал :))


 
aleksey_sv   (2003-03-06 15:50) [19]

Кстати помарочка
sendmessage(hwch,BM_CLICK,0,0);
а не sendmessage(hwch,WM_SYSCOMMAND,BM_CLICK,0);


 
Ghost_   (2003-03-06 15:52) [20]

Всем спасибо за участие сделал так
hh:=FindWindow(nil, PChar("окно"));
SendMessage(FindWindowEx(hh, 0, nil, nil), WM_SETTEXT, 0, Integer(@Str));
hh1:=findwindowEx(hh,0,nil,"OK");
sendmessage(hh1,WM_SYSCOMMAND,BM_CLICK,0);
hh1 -получил Хендл чего-то только кнопка почему-то не
нажалась.:0(


 
Ghost_   (2003-03-06 15:55) [21]

о помарочку не заметил исправил все работает огромное всем мерси..


 
aleksey_sv   (2003-03-06 15:56) [22]

Ну яж говорю помарочка
измени sendmessage(hh1,WM_SYSCOMMAND,BM_CLICK,0);
на sendmessage(hh1,BM_CLICK,0,0);
и всё нажмётся :)))
Извените за дезу :)))


 
Style   (2003-03-06 15:59) [23]

:)) Все ошибаются и прощения друг у друга просят! :) Приятно Добрую ты тему открыл Ghost_



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

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

Наверх





Память: 0.5 MB
Время: 0.009 c
3-12615
Vitual
2003-04-15 14:55
2003.05.05
Открываем ,закрываем


4-12960
Neep
2003-03-04 11:33
2003.05.05
Как создать на API PopUP меню


3-12644
vil
2003-04-16 10:10
2003.05.05
Есть ADOQuery1


1-12762
R
2003-04-22 04:05
2003.05.05
ScrollBars


4-12964
Chubais
2003-01-31 14:41
2003.05.05
глюк TDBGrid в W2K/XP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский