|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 30 июня 2011, 23:58
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 33; последнее сообщение — 5 июля 2011, 11:16; участников в обсуждении: 3.
Страницы: [« Предыдущая] [1] [2]
|
QWERYTY (статус: Посетитель), 1 июля 2011, 22:55 [#21]:
И на том спасибо.
Хотя не понятно зачем так из себя выдавливать.
Мог бы не помогать, а то попадёшь в когнитивный диссонанс, начнётся депрессия.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 1 июля 2011, 23:03 [#22]:
И не буду, пока не подашь признаки самостоятельного функционирования :-P
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 3 июля 2011, 00:04 [#23]:
Так и не получилось.
Вызвал GetLastError, она возвращает 6.
Неверный дескриптор, но я уже перепроверил при помощи WndInfo и PID я получаю правильный.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 3 июля 2011, 13:20 [#24]:
Вижу что что-то читал, однако не до конца, иначе было бы видно, что я забыл про OpenProcess :-)
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 3 июля 2011, 14:34 [#25]:
Ну геморой.
Уменя уже появилась другая идея, послать WM_SYSCOMMAND, SC_CLOSE, а в появившемся дилоге о закрытии найти хендл кнопки "Yes" и ему отправить нажатие интер, или клик мыши.
Но функция FindWindowEx возвращает какой то левый хендл который я даже на всём экране найти не могу.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
bugmenot (статус: 3-ий класс), 3 июля 2011, 16:39 [#26]:
Цитата (QWERYTY):
Ну геморой
Да блин. Делай по шагам. Одна строка - один вызов. Получил промежуточный результат. Следующей строкой проверил на ошибку с помощью Win32Check. И дальше.
имя класса -> HWND -> PID -> hProcess
Цитата (QWERYTY):
функция FindWindowEx
А за каким чертом искать дочерние окна? Я не уверен, что они вообще WM_SYSCOMMAND понимают. Даже если понимают, то скорее всего приложение навернется, если ему внезапно погрохать контролы.
Это тебе надо на stackoverflow пойти и спросить, как taskkill их завершает если вызван без ключа /f.
Я типа не знаю как правильнее всего надо делать.
PS: WM_ENDSESSION попробуй
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 3 июля 2011, 16:46 [#27]:
Спасибо.
Не брошу просто так, завершу начатое, а потом выложу как проблема разрешилась.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 3 июля 2011, 20:13 [#28]:
Грохать контролы конечног нельзя, поэтому мы будем действовать более культурно.
WM_SYSCOMMAND они конечно могут не понимать, но оно и не нужно т.к. мы будем отправлять WM_LBUTTONDOWN и WM_LBUTTONUP.
Я думаю контролы с классом "Button" запросто должны хавать такие сообщения, иначе както алогично выходит.
Вобщем теперь я хочу грохнуть прогу как на каком то форуме выражались не пулей в лоб, а чтоб умерло естественной смертью.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
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™ (статус: Доктор наук), 4 июля 2011, 09:20 [#30]:
Почитал переписку... Перезагрузил мозг...
Цитата (QWERYTY):
Я чувствую как близится тот неотвратимый час, когда я закрою эту хренову прогу.
ДА УДАЛИ ТЫ ЕЁ УЖЕ К @#$%#$% МАТЕРИ!!!!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
QWERYTY (статус: Посетитель), 4 июля 2011, 09:27 [#31]:
После того что мне пришлось пройти охото натравить на эту грёбаную прогу искуственный интелект и генетические алгоритмы, чтоб они её уделали изысканно.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
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 (статус: Посетитель), 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]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|