Форум: "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