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

Вниз

Программно нажать на кнопку закрытия формы(крестик)   Найти похожие ветки 

 
Dimich1978   (2006-04-20 10:57) [0]

Пишу следующее
procedure TForm1.Button1Click(Sender: TObject);
var
 hwndHandle: THANDLE;
 hMenuHandle: HMENU;
begin
 hwndHandle := FindWindow(nil, "Калькулятор");
 if (hwndHandle <> 0) then
 begin
   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
   if (hMenuHandle <> 0) then
   SendMessage(hMenuHandle, BM_CLICK, 0, 0);
 end;
end;
Но нажатия не просиходит, т.е. калькулятор не закрываеться.
Помогите плиз..почему ? и как можно сделать закрытие?


 
MBo ©   (2006-04-20 11:06) [1]

А почему ты считаещь, что меню должно отвечать на сообщение, предназначенное кнопкам?

hwndHandle := FindWindow(nil, "Калькулятор");
if (hwndHandle <> 0) then
  SendMessage(hwndHandle, WM_CLOSE, 0, 0);


 
Dimich1978   (2006-04-20 11:08) [2]

Хорошо, а как нажать кнопку находящуюся на меню?


 
Dimich1978   (2006-04-20 11:21) [3]

ок дошло..спасибо..не увидел с первого раза.


 
AbrosimovA ©   (2006-04-20 11:24) [4]

Известен способ имитации нажатия клавиш в чужом приложении. Ищи в FAQ.


 
Dimich1978   (2006-04-20 12:17) [5]

Имееться 1С, нажимаю программно закрыть её(крестик). Все нормально, но если есть MDI форма то вываливаеться диалог типа "Закончить рабоу программы", мне вот необходимо нажать в этом диалоге, Да.
Пишу:
var
 hwndHandle: THANDLE;
   h2: THANDLE;
 hMenuHandle: HMENU;
begin
 hwndHandle := FindWindow(nil, "1&#209;:&#207;&#240;&#229;&#228;&#239;&#240;&#232;&#255;&#242;&#232;&#229; - &#206;&#225;&#249;&#229;&#239;&#232;&#242; &#240;&#229;&#228;.1.0.030");
 if (hwndHandle <> 0) then
 begin
   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
   if (hMenuHandle <> 0) then
   SendMessage(hwndHandle, WM_CLOSE, 0, 0);
 end;
 if (hwndHandle <> 0) then //Если окно не закрыто значит появился диалог
begin
h2 := FindWindowEx(hwndHandle, 0, "TBitBtn", "&Yes"); - думаю что тут вот проблема, т.к. хендл окна диалоговского другой нежели у главной формы
 SendMessage(h2, BM_CLICK, 0, 0); А тут пытаюсь нажать Да.
end;
end;
Прокомментируйте плиз... и что можно придумать?


 
Dimich1978   (2006-04-20 12:21) [6]

Перенправил..виснет
var
 hwndHandle: THANDLE;
   h2,h1: THANDLE;
 hMenuHandle: HMENU;
begin
 hwndHandle := FindWindow(nil, "1&#209;:&#207;&#240;&#229;&#228;&#239;&#240;&#232;&#255;&#242;&#232;&#229; - &#206;&#225;&#249;&#229;&#239;&#232;&#242; &#240;&#229;&#228;.1.0.030");
 h1:= FindWindow(nil, "1&#209;:&#207;&#240;&#229;&#228;&#239;&#240;&#232;&#255;&#242;&#232;&#229;");
 if (hwndHandle <> 0) then
 begin
   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
   if (hMenuHandle <> 0) then
   SendMessage(hwndHandle, WM_CLOSE, 0, 0);
 end;
   if (hwndHandle <> 0) then
   begin
h2 := FindWindowEx(h1, 0, "TBitBtn", "&Yes");
 SendMessage(h2, BM_CLICK, 0, 0);
   end;


 
AbrosimovA ©   (2006-04-20 13:03) [7]

function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumProc;
 lParam: LPARAM): BOOL; stdcall;


 
Dimich1978   (2006-04-20 13:47) [8]

Виснет прога на этом месте
SendMessage(hwndHandle, WM_CLOSE, 0, 0);
т.е. посылаю форме сообщение на закрытие , закрытия не происходит появляетьяс диалоговое окно и все прога останавливаеться на этом месте..т.е.е выполнение EnumChildWindows не происходит (смотрел пошагово)
вот отрывок
function ef(h:THandle;wparam:integer):boolean;stdcall;
var
 h1:THandle;
 s:string;
begin
{  s:="&#210;&#232;&#239;&#224; &#241;&#229;&#240;&#232;&#233;&#237;&#251;&#233; &#237;&#238;&#236;&#229;&#240;";
 if wparam<>5 then begin}
   SendMessage(h,WM_COMMAND,wparam,0);//&#210;&#232;&#239;&#224; &#241;&#238;&#238;&#225;&#249;&#224;&#229;&#236; &#228;&#232;&#224;&#235;&#238;&#227;&#243;, &#247;&#242;&#238; &#236;&#251; &#237;&#224;&#230;&#224;&#235;&#232;
{  end else begin
   h1:=FindWindowEx(h,0,"Edit",nil);  //&#200;&#249;&#229;&#236; &#242;&#240;&#229;&#242;&#232;&#233; &#239;&#238; &#241;&#247;&#229;&#242;&#243; Edit &#232; &#226;&#226;&#238;&#228;&#232;&#236; &#226; &#237;&#229;&#227;&#238; &#242;&#229;&#234;&#241;&#242;
   h1:=FindWindowEx(h,h1,"Edit",nil);
   h1:=FindWindowEx(h,h1,"Edit",nil);
   SendMessage(h1,WM_SETTEXT,0,cardinal(s));
 end;}
 result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 hwndHandle: THANDLE;
   h2,h1,h: THANDLE;
 hMenuHandle: HMENU;
begin
 hwndHandle := FindWindow(nil, "1С:Предприятие - Конфа.1.0.030");
 if (hwndHandle <> 0) then
 begin
   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
   if (hMenuHandle <> 0) then
   SendMessage(hwndHandle, WM_CLOSE, 0, 0);
     Sleep(1000);
 h:=FindWindow(nil, "1С:Предприятие);
 EnumChildWindows(h,@ef,0);
 end;

end;
Почему происходит завис....не догоняю..


 
Dimich1978   (2006-04-20 14:27) [9]

Висла прога на sendmessage переделал на postmessage все ок.

procedure TForm1.Button1Click(Sender: TObject);
var
 hwndHandle: THANDLE;
   h2,h1,h: THANDLE;
 hMenuHandle: HMENU;
begin
 hwndHandle := FindWindow(nil, "1С:Предприятие - Общепит ред.1.0.030");
 if (hwndHandle <> 0) then
 begin
   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);
   if (hMenuHandle <> 0) then
//    SendMessage(hwndHandle, WM_CLOSE, 0, 0);
 PostMessage(hwndHandle, WM_CLOSE, 0 ,0);
 h:=FindWindow(nil, "1С:Предприятие");

//  EnumChildWindows(h,@ef,0);

 if (hwndHandle <> 0) then
   begin
h2 := FindWindowEx(h, 0, "TButton", "&Да");
 SendMessage(h2, BM_CLICK, 0, 0);
   end;
end;
end;
вторая часть , а именно закрытие диалогового окна через FindWindowEx не получаеться значит надо делать через EnumChildWindows.
Можно пример как с ней работать и вычислить мое диалоговое окно и нажать на кнопку.
Спасибо. Помогите плиз.


 
AbrosimovA ©   (2006-04-20 15:16) [10]

А какой текст в заголовке диалогового окна?


 
AbrosimovA ©   (2006-04-20 15:23) [11]

function ChildWnd(h:THandle; wparam:integer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
if Text = "&Да" then begin
 SendMessage(h,BM_CLICK,0,0);
 result:=false;
end else result:=true;
end;

function ParentWnd(h:THandle; wparam:integer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
if StrPas(Text) = "1С:Предприятие" then begin
  EnumChildWindows(h,@ChildWnd,0);
  result:=false;
end else result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@ParentWnd,0);
end;


 
Dimich1978   (2006-04-20 16:55) [12]

по данному коду происходит следующее.
Выскакивает диалоговое окно и ничего не происходит. Проходит некоторое время...я перехожу на форму 1С и нажимаю кнопку НЕТ(не заканчиватьь работу с программой), чтобы не закрывалось. Но 1С закрываеться.  
добавил memo1.lines.add(text);
в данном списке не видно 1С:Предприятие...хотя определяю его windows text выдает что 1С:Предприятие, да и в заголовке диалогового окна тоже написано 1С:Предприятие. Блин осталось чуточку чтобы дописать...видна победа....
помогите еще чуть чуть.
Заранее благодарен
function ChildWnd(h:THandle; wparam:integer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
if Text = "&Да" then begin
SendMessage(h,BM_CLICK,0,0);
result:=false;
end else result:=true;
end;

function ParentWnd(h:THandle; wparam:integer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
form1.memo1.lines.add(text);
if StrPas(Text) = "1С:Предприятие" then begin
 EnumChildWindows(h,@ChildWnd,0);
 result:=false;
end else result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
hwndHandle: THANDLE;
   h2,h1,h: THANDLE;
 hMenuHandle: HMENU;
begin
h := FindWindow(nil, "1С:Предприятие - Конфа.1.0.030");
 if (h <> 0) then
 begin
   hMenuHandle := GetSystemMenu(h, FALSE);
   if (hMenuHandle <> 0) then
 PostMessage(h, WM_CLOSE, 0 ,0);
 end;
EnumWindows(@ParentWnd,0);
end;


 
AbrosimovA ©   (2006-04-21 08:12) [13]

Я не совсем понял, какое окно у тебя является диалоговым, и что это за манипуляции с WM_CLOSE.
А здесь
> form1.memo1.lines.add(text);

заменить на StrPas(text)


 
Dimich1978   (2006-04-21 12:46) [14]

Т.е. я закрываю окно 1С главное. Вываливаеться диалогове окно.. www.ochakovo2.ru/screen.jpg
вот его и надо закрыть, точнее нажать Да и закрыть.
А про манипуляции PostMessage(h, WM_CLOSE, 0 ,0) т.е. почему не через sendmessage?


 
Dimich1978   (2006-04-21 12:47) [15]

Т.е. я закрываю окно 1С главное. Вываливаеться диалогове окно.. www.ochakovo2.ru/screen.jpg
вот его и надо закрыть, точнее нажать Да и закрыть.
А про манипуляции PostMessage(h, WM_CLOSE, 0 ,0) т.е. почему не через sendmessage?


 
AbrosimovA ©   (2006-04-24 16:31) [16]

function ChildWnd(h:THandle; Info: Pointer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
Form1.Memo1.Lines.Add(Text,nil); // Все чилды окна
if Text = "Да" then begin // Здесь возможны варианты: &Да или Д&а, это будет видно из Memo1
 SendMessage(h,BM_CLICK,0,0);
 result:=false;
end else result:=true;
end;

function ParentWnd(h:THandle; Info: Pointer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 256);
if StrPas(Text) = "1С:Предприятие" then begin // Английская С или русская?
  EnumChildWindows(h,@ChildWnd,0);
 Form1.Memo1.Lines.Add(Text,nil); // для контроля, что окно найдено
  result:=false;
end else result:=true;
end;


 
Eraser ©   (2006-04-24 16:39) [17]


> Dimich1978   (21.04.06 12:47) [15]


> А про манипуляции PostMessage(h, WM_CLOSE, 0 ,0) т.е. почему
> не через sendmessage?

1. PostMessage работает асинхронно, т.е. осослал и забыл, а SendMessage - синхронно, т.е. отсылает и ждёт ответа, которые не всегда и нужен.
2. SendMessage(h, WM_CLOSE, 0 ,0) не работает в win98, почему - не вкурсе, наверное, потому что обрабатывается не в оконной процедуре окна.


 
Dimich1978   (2006-04-24 18:04) [18]

Окно закрываеться , но со второго раза, т.к. по первому разу происходит активация окна (диалогового) и кнопки, потом происходит собственно нажатие....данный путь возможно сократить или посылать сразу просто два sendmessage подряд?


 
Eraser ©   (2006-04-24 18:24) [19]


> Dimich1978   (24.04.06 18:04) [18]


> Окно закрываеться , но со второго раза, т.к. по первому
> разу происходит активация окна (диалогового) и кнопки, потом
> происходит собственно нажатие....

"Эт врядли" (с)
хотя сам не проверял.


 
Dimich1978   (2006-04-27 13:55) [20]

По вышеописанному коду все работает ОК. Но есть одна штука. Т.е когда я пытаюсь закрыть приложение, то могут выскакивать  в1С (с одинаковым заголовком и отличающееся) диалоговые окна, которые надо закрыть все подряд надимая Да. Немного дописал. Прога окна стала закрывать. Но необходимо постоянно посылать команды для закрытия, т.е.е выпало 3 окна три раза надо на кнопку нажать. Хотелось бы автоматизировать.
т.е. закрывать окна пока не закроеться приложение.
К примеру я нажимаю Закрыть программу, в ответ появляетьяс окно, Сохраните изменения, я отвечаю ДА, в ответ выскакивает окно, Время проведения документа...нужно ответить ОК. Т.е. у меян выскочило 3 диалоговых окна, необходимо процедуру    EnumWindows(@ParentWnd,0) вызвать 3 раза, а если вылетить 4 окна. Т.е. хотелось бы закрыть их , точнее закрывать пока не закроеться приложение. Если мой бред хоть чуть чуть понятен, скажите как енто можно сделть.
Заранее спасибо.
function ChildWnd(h:THandle; Info: Pointer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 200);
Form1.Memo1.Lines.Add(Text);
if (StrPas(Text) = "&Да")or (StrPas(Text) = "OK")then begin
postMessage(h,BM_CLICK,0,0);
result:=false;
end else result:=true;
end;

function ParentWnd(h:THandle; Info: Pointer): Bool;stdcall;
var
Text: array [0..256] of Char;
begin
GetWindowText(h, text, 256);
if (StrPas(Text) = "1С:Предприятие) or (strpas(text)="Ввод времени") then begin
 EnumChildWindows(h,@ChildWnd,0);
Form1.Memo2.Lines.Add(Text);
 result:=false;
end else result:=true;
end;

procedure TForm1.close1c_ON;
begin
  EnumWindows(@ParentWnd,0);
end;

procedure TForm1.close1c_start(Sender: TObject);
var
   h: THANDLE;
begin
h := FindWindow(nil, "1С:Предприятие - Комплексная конфа 4.5");
 PostMessage(h, WM_CLOSE, 0 ,0);
end;



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

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

Наверх




Память: 0.54 MB
Время: 0.041 c
2-1154080034
Sank
2006-07-28 13:47
2006.08.20
опять кодировка


2-1154383727
Николас
2006-08-01 02:08
2006.08.20
Синхронизация потоков


2-1154272586
Nikolaich
2006-07-30 19:16
2006.08.20
TMessage


15-1153819930
CHES
2006-07-25 13:32
2006.08.20
Вопрос по MSSQL 2000


2-1154029748
Korolaa
2006-07-27 23:49
2006.08.20
передача картинки по Stream