Написать прогу, закрывающую сообщения об ошибках

glare

Уважаемые отцы!
У меня на компе днем и ночью крутится прога (Progress Quest). Это супер прога, но она регулярно выбрасывает безобидные сообщения об ошибке, и если их не трогать, за сутки набирается полэкрана табличек.
Не то, чтобы это меня сильно беспокоило, но всё-таки, можно ли написать какой-нибудь виндовый скрипт, или просто независимую программу, которая которая будет такие сообщения сразу закрывать?

Helga87

Да, можно. Это довольно просто делается на WinAPI.

glare

А как?
Есть ли пример программы с исходником, которая делает что-нибудь с виндовыми окнами?
На чём это пишется?

stm6695895

У меня на компе днем и ночью крутится прога (Progress Quest). Это супер прога, но она регулярно выбрасывает безобидные сообщения об ошибке, и если их не трогать, за сутки набирается полэкрана табличек.
а что за ошибки такие pq выдает?

Helga87

А как?
Есть ли пример программы с исходником, которая делает что-нибудь с виндовыми окнами?
На чём это пишется?
HWND hWnd = FindWindow(NULL, "Window title"); 
SendMessage(hWnd, WM_CLOSE, 0, 0);

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

glare

а что за ошибки такие pq выдает?

Вот такие:

Но только после 80-го уровня, кажется.

Helga87

Но только после 80-го уровня, кажется.
Это чо такое?

Helga87

И эта - у тебя XP или Vista?

glare

Если дашь screenshot такой ошибки, я попробую написать.

Скриншот дал
тогда меня будет ломать допиливать эту программ

Хых, я с удовольствием допишу сам, если будет понятно, на чём писать, и какие можно использовать команды.

Helga87

C / C++, функции FindWindow, SendMessage.
Я тут чо-то накорябал. Попробуй, может сработает.

vall

круто! дальнейшая автоматизация Progress Quest это просто эпично.
ты кстати напомнил. у меня в древней-мохнатой тестовой ситеме для ЛКШ был такой демон чтоб ошибки виндового довосового эмулятора прибивать. и у Макса в мегасистеме что на сборах использовалась тоже что-то такое было =)

glare

Чота не запускается...

glare

The Progress Quest - это самая крутая РПГ из всех, созданных человечеством по сей день.
Практически без перерывов (даже на сон) я играю в неё уже несколько лет, и меня всё больше прёт.

0000

не хватает dll-ек от VS2005 скорее всего. Надо установить vcredist_x86.exe. Ищи в сетке.

glare

А можно ли то же самое написать на vbs (как плюс - не будет требоваться компиляция...) ?

AlexV769

скорее всего можно. и на JScript тоже

Selena

autoit попробуй

Andr163

+1 к autoit, скрипт для него строчки 3 наверное займет :)

Andr163

4 :grin: что-то вроде:

While (1)
WinWaitActive ("Progress Quest", "Access violation at address")
ControlClick ("Progress Quest", "Access violation at address", "Button1")
WEnd

0000

FindWindow и SendMessage это WinAPI функции. Они из dll-ей вызываются, а WSH (vb script) нифига с ними работать не умеет. Толи дело VBA.
Если надо могу переписать прогу 'а как макрос в Excel или Word.

bleyman

Вово, я аж офигел, какие тут любители пописать велосипеды собрались.
Только не AutoIT, а AutoHotkey =)

Helga87

не хватает dll-ек от VS2005 скорее всего. Надо установить vcredist_x86.exe. Ищи в сетке.
похоже я на 64 бита скомпилил.
Завтра вернусь домой и выложу нормальную версию.

Andbar

Да зачем ждать?
Это покатит?
#include <Windows.h>
#include <tchar.h>

#pragma comment(linker, "/ENTRY:main")
#pragma comment(linker, "/merge:.rdata=.text")
void main(void)
{
while(1)
{
HWND hWnd = FindWindow(NULL, _T("Progress Quest";
if(hWnd) PostMessage(hWnd, WM_CLOSE, 0, 0);
Sleep(1000);
}
}

ps: и никаких, блин, библиотек. Жаль, забыл, как уменьшать размер выравнивания сегмента, а то бы размер был меньше 2К.

0000

По моему задачу надо решать с другого конца :)
Не пытаться закрывать окошко раз в секунду, а при запуске написанной проги - закрывать все окошки.

Andbar

По моему задачу надо решать с другого конца :)
Предлагаешь запускать из батника циклически?
Думаю "регулярно выбрасывает окошки" - это, скорее всего, гораздо реже чем раз в секунду. Хотя да, там следовало сделать ещё один цикл, но думаю, обойдётся и без этого. Имхо, если ошибки идут слишком часто, значит что-то не то.
Ну, в общем, ладно. Вот другая версия:
12c12
< Sleep(1000);
---
> else break;

lubanj

а что если просто нажать клавишу ентер и держать ее н секунд, пока все окошки не закроются?
или там с фокусом ввода совсем жестко обходятся?

Andbar

можно увлечься и будут лишние (вероятно - нежелательные) нажатия

0000

Предлагаю написать прогу, которая закрывает не одно окно, а все с нужным заголовком.
В быстрый запуск повесить ярлык на эту прогу - пусть автор ее сам запускает, когда много окошек надо закрыть.

Andbar

второй вариант так и делает ;)

apl13

HWND hWnd = FindWindow(NULL, "Window title");
SendMessage(hWnd, WM_CLOSE, 0, 0);
Блин, а в никсоконсольных достаточно 2>/dev/null...

Andbar

Блин, а в никсоконсольных достаточно 2>/dev/null...
Этого достаточно в любых консольных, не только в никсоконсольных :p :p :p

Dasar

Блин, а в никсоконсольных достаточно 2>/dev/null...
это если программа удовлетворяет правилам хорошего тона, а если не удовлетворяет - то пытаться выловить сообщения об ошибках из потока вывода
оконная прога по правилам хорошего тона тоже должна ошибки сливать в отдельное окно(например в нижний combo а не открывать messageBox-ы на каждую ошибку.

apl13

Ч0-то я не уверен, что винда такое поймет, если на нее *sh не ставить.

lebed853

> nil

apl13

Ну блин, это уже модификация. :umnik:
Хотя да, короче.

Andbar

> nil
2>nul

vall

а 3<xxx он поймёт?
ЗЫ
пошлый какой-то редирект получился =)

Andbar

а 3<xxx он поймёт?
что за третий поток?

glare

Классный вариант )
Единственный минус - он закрывает основную программу тоже.
Нет ли способа это изменить?
Да зачем ждать?
Это покатит?
  #include <Windows.h>
#include <tchar.h>

#pragma comment(linker, "/ENTRY:main")
#pragma comment(linker, "/merge:.rdata=.text")
void main(void)
{
while(1)
{
HWND hWnd = FindWindow(NULL, _T("Progress Quest";
if(hWnd) PostMessage(hWnd, WM_CLOSE, 0, 0);
Sleep(1000);
}
}

ps: и никаких, блин, библиотек. Жаль, забыл, как уменьшать размер выравнивания сегмента, а то бы размер был меньше 2К.

pitrik2

Единственный минус - он закрывает основную программу тоже.
Нет ли способа это изменить?
я ждал этого :)
вообще такие окна закрываются не ентером а эскейпом
тоесть утром достаточно зажать кнопку эскейп, а это гораздо безопаснее чем зажать ентер
ну и автоит (автохоткей или как там) тебе уже предложили
это афигенное решение
а главное многоразовое, научишься пользоваться ентой клевой тулзой будешь пользоваться ею и опосля

glare

UPD.: Работает - прикольно. Только не закрывает неактивные окна, но концепт ясен.
Прога клёвая, спасибо за совет )

Такое не работает
Хотя я попробую разобраться.
 
4 :grin: что-то вроде:
 
   --------------------------------------------------------------------------------
While (1)
WinWaitActive ("Progress Quest", "Access violation at address")
ControlClick ("Progress Quest", "Access violation at address", "Button1")
WEnd

  

glare

да в общем не было большой проблемы окна закрывать
просто автоматическое закрытие окошек - это прикольно

Andbar

Попробуй это:
#include <Windows.h>
#include <tchar.h>
#pragma comment(linker, "/ENTRY:main")
#pragma comment(linker, "/merge:.rdata=.text")
void main(void)
{
// wchar_t t[256];
// GlobalGetAtomName(32770, t, 256);
while(1)
{
HWND hWnd = FindWindow(NULL, _T("Progress Quest";
if(hWnd)
{
if (GetWindowLong(hWnd, GWL_STYLE)&WS_POPUP)
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
else break;
}
}
Если всё-равно будет закрывать, будем ограничивать более жёстко.

glare

Победил такой вариант:

While (1)
WinWait ("Progress Quest", "Access violation at address")
ControlClick ("Progress Quest", "Access violation at address", "Button1")
WEnd

Супер тема - компилится в exe-шник, висит в трее (! ресурсов практически не жрёт, закрывает сообщения сразу, как только они появляются.
Прога на С тоже очень порадовала, т.к. с ней можно делать всё, что угодно, и места и ресурсов она ещё меньше жрёт.
Собственно, всем бААльшое спасибо )
Оставить комментарий
Имя или ник:
Комментарий: