Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 465

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Не получается уничтожить окно. Не срабатывают ни DestroyWindow ни SendMessage. С хендлом ошибки нет, перепроверенно 150 раз.
Причём SendMessage срабатывает когда я посылаю сообщение сделать курсор вопросительным знаком:

SendMessage(Handle, WM_SYSCOMMAND, SC_CONTEXTHELP, 0); или
когда пытаюсь закрыть:

SendMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0); но при этом появляется диалог подтверждения. Подскажите как закрыть окно без лишних вопросов и подтверждений.

Спасибо.

Примечание #1 (1 июля 2011, 00:11):
Может это важно, я посылаю сообщение в момент закрытия своей проги. Пробовал и когда FormDestroy и когда FormClose, но окно как дамоклов меч, на месте.
И вот так тоже пробовал:
SendMessage(Handle, WM_QUIT, 0, 0);

QWERYTY Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 30 июня 2011, 23:58
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 33; последнее сообщение — 5 июля 2011, 11:16; участников в обсуждении: 3.

Страницы: [« Предыдущая] [1] [2]

QWERYTY

QWERYTY (статус: Посетитель), 1 июля 2011, 22:55 [#21]:

И на том спасибо.

Хотя не понятно зачем так из себя выдавливать.
Мог бы не помогать, а то попадёшь в когнитивный диссонанс, начнётся депрессия.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 1 июля 2011, 23:03 [#22]:

И не буду, пока не подашь признаки самостоятельного функционирования :-­P
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 3 июля 2011, 00:04 [#23]:

Так и не получилось.
Вызвал GetLastError, она возвращает 6.
Неверный дескриптор, но я уже перепроверил при помощи WndInfo и PID я получаю правильный.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 3 июля 2011, 13:20 [#24]:

Вижу что что-то читал, однако не до конца, иначе было бы видно, что я забыл про OpenProcess :­-)
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 3 июля 2011, 14:34 [#25]:

Ну геморой.
Уменя уже появилась другая идея, послать WM_SYSCOMMAND, SC_CLOSE, а в появившемся дилоге о закрытии найти хендл кнопки "Yes" и ему отправить нажатие интер, или клик мыши.
Но функция FindWindowEx возвращает какой то левый хендл который я даже на всём экране найти не могу.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
bugmenot

bugmenot (статус: 3-ий класс), 3 июля 2011, 16:39 [#26]:

Цитата (QWERYTY):

Ну геморой

Да блин. Делай по шагам. Одна строка - один вызов. Получил промежуточный результат. Следующей строкой проверил на ошибку с помощью Win32Check. И дальше.
имя класса -> HWND -> PID -> hProcess

Цитата (QWERYTY):

функция FindWindowEx

А за каким чертом искать дочерние окна? Я не уверен, что они вообще WM_SYSCOMMAND понимают. Даже если понимают, то скорее всего приложение навернется, если ему внезапно погрохать контролы.
Это тебе надо на stackoverflow пойти и спросить, как taskkill их завершает если вызван без ключа /f.
Я типа не знаю как правильнее всего надо делать.

PS: WM_ENDSESSION попробуй
виконання програми розпочинається з того самого мiсця, де призупинилося.

QWERYTY

QWERYTY (статус: Посетитель), 3 июля 2011, 16:46 [#27]:

Спасибо.
Не брошу просто так, завершу начатое, а потом выложу как проблема разрешилась.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 3 июля 2011, 20:13 [#28]:

Грохать контролы конечног нельзя, поэтому мы будем действовать более культурно.
WM_SYSCOMMAND они конечно могут не понимать, но оно и не нужно т.к. мы будем отправлять WM_LBUTTONDOWN и WM_LBUTTONUP.
Я думаю контролы с классом "Button" запросто должны хавать такие сообщения, иначе както алогично выходит.
Вобщем теперь я хочу грохнуть прогу как на каком то форуме выражались не пулей в лоб, а чтоб умерло естественной смертью.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 4 июля 2011, 02:01 [#29]:

Я чувствую как близится тот неотвратимый час, когда я закрою эту хренову прогу.
На данный момент я уже вышел на кнопку, пришлось добавить вот такую функцию:
 function Children(Child: THandle; LParam:Integer): Boolean; stdcall;
begin
     Result:=False;
     if Child <> 0 then
     begin
          Setlength(MassivForms,CountForm+1);
          MassivForms[CountForm]:=Child;
          inc(CountForm);
          Result:=True;
     end;
end;

Ну и соответственно выходим на кнопку, и кликаем нужную нам кнопку:
procedure TForm1.Button1Click(Sender: TObject);
var
ExitHandle, ExitBTNHandle: HWND;
begin
     PostMessage(ParentHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
     Sleep(500);
     ExitHandle:= FindWindowEx(0, 0, nil,'Exit Confirmation');
     if ExitHandle <> 0 then
     begin
          if EnumChildWindows(ExitHandle, @Children, 0) then
          begin
               ExitBTNHandle:= MassivForms[3];// Имперически полученные данные
            // но из всех попыток этот контрол всегда на 4-ом месте
          end;
     end;
     Edit3.Text:= FloatToStr(ExitBTNHandle);
     Sleep(1000);
     SendMessage(ExitBTNHandle, WM_LBUTTONDOWN, 0, 0);
     Sleep(Random(100));
     SendMessage(ExitBTNHandle, WM_LBUTTONUP, 0, 0);
End;

Я уже вижу как происходит клик по нужной кнопке, но прога пока не закрывается.
Считаю нужным додавить эту тему.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
min@y™

min@y™ (статус: Доктор наук), 4 июля 2011, 09:20 [#30]:

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

Цитата (QWERYTY):

Я чувствую как близится тот неотвратимый час, когда я закрою эту хренову прогу.

ДА УДАЛИ ТЫ ЕЁ УЖЕ К @#$%#$% МАТЕРИ!!!!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
QWERYTY

QWERYTY (статус: Посетитель), 4 июля 2011, 09:27 [#31]:

После того что мне пришлось пройти охото натравить на эту грёбаную прогу искуственный интелект и генетические алгоритмы, чтоб они её уделали изысканно. :-)
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 4 июля 2011, 19:06 [#32]:

Криво конечно, но задача решена.
Есть конечно неудовлетворение в душе, столько время убил да ещё и решил не на 5+.
Но по нормальному не захотела она закрываться, я с WM_SETFOCUS эксперементировал но максимум чего добился это исчезновения самого окна подтверждения выхода.
SetFocus вообще меня удивил, пишет что мол много параметров я ввожу, хотя вводил я только хендл. В итоге пака так:

 ExitBTNHandle:= MassivForms[3];
              PostMessage(ExitBTNHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
              PostMessage(ExitBTNHandle, WM_LBUTTONUP, MK_LBUTTON, 0);
              PostMessage(ExitBTNHandle, WM_KEYDOWN, 13, 0);
              PostMessage(ExitBTNHandle, WM_KEYUP, 13, 0);

Буду рад если кто нибудь объяснит почему фокус устанавливается клик происходит, а эффект не такой как от мышки(т.е. закрытие не происходит).
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 5 июля 2011, 11:16 [#33]:

А вот и неотвратимый час.
Там ещё была проблемка, когда в главном окне на вопр. о закрытии отвечаешь да то появляется такой же диалог о закрытии во всех дочерних. Выкладываю решение(для счастливчиков которые не будут убивать 2 недели, а если чёто не понятно тогда бросаем кодить и лопаты в руки):
 
procedure TForm1.Button1Click(Sender: TObject);
var
ExitHandle, ExitBTNHandle: HWND;
begin
    PostMessage(ParentHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
    Sleep(1000);
    ExitHandle:= FindWindowEx(0, 0,nil,'Exit Confirmation');
    if ExitHandle <> 0 then
    begin
         if EnumChildWindows(ExitHandle, @Children, 0) then
         begin
              Sleep(Random(2000));
              ExitBTNHandle:= MassivForms[3];
              PostMessage(ExitBTNHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
              Sleep(10+Random(50));
              PostMessage(ExitBTNHandle, WM_LBUTTONUP, MK_LBUTTON, 0);
              PostMessage(ExitBTNHandle, WM_KEYDOWN, 13, 0);
              Sleep(20+Random(50));
              PostMessage(ExitBTNHandle, WM_KEYUP, 13, 0);
              ExitHandle:= FindWindowEx(0, 0,'#32770', nil);
         end;
         While ExitHandle <> 0 do
         begin
              PostMessage(ExitHandle, WM_quit, 0, 0);
              Sleep(1500+Random(1500));
              ExitHandle:= FindWindowEx(0, 0,'#32770', nil);
         end;
    end;
end;
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

18 июля 2011, 00:52: Статус вопроса изменён на решённый (изменил автор вопроса — QWERYTY): Вопрос решён.

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 23:16
Выполнено за 0.03 сек.