Вопрос Как работать с функцией FindWindowEx?

Хамик

Старожил
Почему данный пример не работает? Использую unicode от restools
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Code]
const
BM_CLICK = $F5;
WM_GETTEXT = $D;
WM_GETTEXTLENGTH = $E;
function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';
procedure InitializeWizard();
var
ResultCode: Integer;
AppWnd, EditWnd: LongWord;
length: LongInt;
Text: String;
begin
if Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
ewWaitUntilIdle, ResultCode) then
begin
AppWnd:= FindWindowByWindowName('Калькулятор');
if AppWnd <> 0 then
begin
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '7'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '/'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '8'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '='), BM_CLICK, 0, 0);
EditWnd:= FindWindowEx(AppWnd, 0, 'EDIT', '');
length:= SendMessage(EditWnd, WM_GETTEXTLENGTH, 0, 0);
Text:= StringOfChar(' ', length);
SendMessage(EditWnd, WM_GETTEXT, length, CastStringToInteger(Text));
MsgBox(Text, mbInformation, MB_OK);
end;
end;
end;
 
Последнее редактирование:

Krinkels

Он где то тут
Администратор
Проверь что возвращает, скажем, FindWindowEx(AppWnd, 0, 'Button', '7'), чтоб убедиться точно что находит кнопку
 

Krinkels

Он где то тут
Администратор
Хм, WinSpy говорит что у кнопочки "7" нет текста

calc.PNG
 
Последнее редактирование:

Krinkels

Он где то тут
Администратор
Если калькулятор для примера то забей на него, если нет то напиши свой :)
 

Хамик

Старожил
Если калькулятор для примера то забей на него, если нет то напиши свой
забить то можно, но это не решение. Мне интересно как управлять другим окном с помощью inno. В частности вводить текст и нажимать на кнопки.
 

Krinkels

Он где то тут
Администратор
Ну калькулятор не лучшее для этого решение. Возьми, для примера, другой установщик, и на нем тренируйся. Там и кнопки, и поле ввода есть
 

David.D.Rocco

Участник
Проверенный
без примера я без понятия как все это делать. И как указать @LPZстрока в inno?
Код:
SEndMessage(myhwnd,WM_SETTEXT,0,@LPZстрока)
Код:
function SetText(hWnd: Integer; Msg: UINT; wParam: Longint; lParam: Pansichar): Integer;
  external 'SendMessageA@user32.dll stdcall';
...
SetText(Handle, $000C, 0, 'Text');
 

David.D.Rocco

Участник
Проверенный
Вот так выглядит клик по окну
Код:
SendMessage(Handle, $0201, 0, 0);
SendMessage(Handle, $0202, 0, 0);
 

sergey3695

Ветеран
Модератор
Как скрыть сообщения деинсталлятора? в FAQ. там как раз клик. но там малость не правильно хоть и будет работать как надо, FindWindowEx(Wnd, 0,'Button', '' (тут типо надпись кнопки));
 

Хамик

Старожил
sergey3695, с этим понятно и клик работает. Но как отправить клик на сообщение (msgbox)? Надо определять хэндл? Определяю но не работает.
 

Хамик

Старожил
возьмем инсталлятор test2.exe

Код:
[Setup]
AppName=App
AppVersion=1.0
DefaultDirName={pf}\My Program
OutputBaseFilename=test2
и попробуем запустить и закрыть с подтверждением

Код:
[Setup]
AppName=App test
AppVersion=1.0
DefaultDirName={pf}\app
OutputDir=.

[Code]
Const
  BM_CLICK = $00F5;

function FindWindowEx(Parent, Child: HWND; ClassName, WindowName: Pansichar): HWND; external 'FindWindowExA@user32.dll stdcall';

function InitializeSetup(): Boolean;
var
  r: integer;
begin
Result := Exec(ExpandConstant('{src}\test2.exe'), '', '', SW_SHOW, ewNoWait, R);
Sleep(300);
end;

//procedure InitializeWizard();
//var
//  AppWnd, WndEx,  WndBtn, Wnd: HWND;
//  msg: string;
//begin
//if FindWindowByWindowName('Установка — App') <> 0 then
//begin
// AppWnd:= FindWindowByWindowName('Установка — App');
// WndBtn:= FindWindowEx(AppWnd,0,'TNewButton', 'Отмена');
// Wnd:= FindWindowByWindowName(msg);
// WndEx:= FindWindowEx(Wnd, 0,'Button', '&Да');
// SendMessage(WndBtn, BM_CLICK, 0,0);
// Sleep(300);
// SendMessage(WndEx, BM_CLICK, 0,0);
//end;
//end;

procedure InitializeWizard();
var
  AppWnd, WndEx,  WndBtn, Wnd: HWND;
  msg: string;
begin
if FindWindowByWindowName('Установка — App') <> 0 then
begin
AppWnd:= FindWindowByWindowName('Установка — App');
WndBtn:= FindWindowEx(AppWnd,0,'TNewButton', 'Отмена');
SendMessage(WndBtn, BM_CLICK, 0,0);
Sleep(300);

Wnd:= FindWindowByWindowName(msg);
  if Wnd > 0 then
  WndEx:= FindWindowEx(Wnd, 0,'Button', '&Да');
  if WndEx > 0 then
  SendMessage(WndEx, BM_CLICK, 0, 0);
end;
end;
но оно не закрывается. Почему? В чем косяк?
 

Хамик

Старожил
Посмотрите кто-нибудь и посоветуйте что-то. Я в тупике(( Пример уже готов, надо всего лишь его подкорректировать. так пробовал тоже не идет
Код:
procedure InitializeWizard();
var
  AppWnd, WndEx,  WndBtn, Wnd: HWND;
begin
if FindWindowByWindowName('Установка — App') <> 0 then
begin
AppWnd:= FindWindowByWindowName('Установка — App');
WndBtn:= FindWindowEx(AppWnd,0,'TNewButton', 'Отмена');
Wnd:= FindWindowByWindowName('Выход из программы установки');
WndEx:= FindWindowEx(AppWnd, Wnd,'Button', '&Да');
SendMessage(WndBtn, BM_CLICK, 0,0);
Sleep(300);
SendMessage(WndEx, BM_CLICK, 0,0);
end;
end;
 
Сверху