Закрытие навязчивых окон 1С

Программа для закрытия навязчивых окон в 1С и других приложениях. Использую ее, т.к. часто в копиях баз, предоставляемых клиентом при работе возникают навязчивые сообщения, на закрытие которых тратится драгоценное время.


Клиенты часто предоставляют мне копии своих баз. В последнее время 1С стало выдавать много навязчивых оповещений, которые мешают мне, как разработчику. Я трачу своё время на закрытие этих ненужных мне оповещений.

Вот примеры таких оповещений:

Приходится снимать галочку «Показывать при начале работы».
Это сообщение вообще не отключается.

Чтобы решить проблему раз и навсегда, я заказал программисту небольшую программку на Си, которая закрывает окна по их заголовку.

Как использовать программу

Программа называется kwnd.exe.

Заголовки окон нужно написать в файле kwnd без расширения и разместить в одной папке с kwnd.exe. Каждый заголовок должен быть с новой строки.

Для приведенных выше навязчивых окон 1С файл заголовков окон kwnd выглядит так:

Информация - Бухгалтерия предприятия, редакция 3.0
Рекомендуется обновить версию конфигурации

Программа консольная, не имеет графического интерфейса.

Программа работает в бесконечном цикле, но не завершается, проверяет список окон по таймеру. Если указать при запуске kwnd.exe числовой параметр, то очередь будет опрашиваться раз в указанное количество секунд.

Пример для запуска проверки очереди раз в секунду:

kwnd.exe 1 

Второй экземпляр kwnd.exe не запускается, программа выдает предупреждение, что она уже запущена. Снять программу можно через диспетчер задач:

Программа не нагружает процессор, несмотря на то, что постоянно проверяет список окон.

Для автозапуска программы используйте команду shell:startup или shell:common startup для открытия папки автозапуска текущего или всех пользователей.

В папке разместите ярлык на программу:

После этого можно забыть о навязчивых сообщениях.

У некоторых пользователей были проблемы с работой программы, т.к. они прописывали запуск из планировщика и, возможно, программа запускалась от имени администратора, а не текущего пользователя, поэтому лучше прописывать ярлык в папку автозапуска.

Как определить заголовок программы

Обычно нет проблем визуально определить заголовок окна. Но иногда нужно получить точное название.

Для точного определения заголовка я использую Au3Info.exe от программы AutoIt.

Ее можно получить после установки AutoIT. Или скачать отдельно, она работает и отдельно от пакета AutoIt.

Также можно использовать AU3_Spy из пакета AutoHotKey и множество других подобных программ.

Получить программу

Исходный код программы:

#pragma hdrstop
#pragma argsused
 
#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif
 
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <ctime>
#include <tchar.h>
#include <string> // подключаем строки
#include <fstream> // подключаем файлы
 
 #define NAME_CONSOLE "myConsole"
 
using namespace std;
 
HWND hWnd;
HANDLE mutex;//Глобальный хендл мютекса
 
 int _tmain(int argc, _TCHAR* argv[])
{
 
 //При открытии программы пытаемся создать мютекс.
 //Мютекс - такой объект, который можно увидеть из любого приложения системы
   mutex=CreateMutex(NULL,true,"kWnd");
   DWORD result;
   result = WaitForSingleObject(mutex,0);//А теперь пытаемся его захватить себе
   //Если его захватить не получается, значит мютекс уже захватил кто-то другой
   if(result!=WAIT_OBJECT_0)
	 {
	  cout<<"the program is already running, and the second copy cannot be started"<<endl;
	  Sleep(5000);
	  exit(-1);
	 }
 
 
 FreeConsole();
 
 // переменная для сброса строки, прочитанной из файла.
 // Используется в ходе подсчета строк в файле, больше ни для чего не нужна
 string AS;
 
 // определим количество строк в файле в переменной i
  int i=1;
  ifstream file("kWnd");
  while (getline(file, AS))
  {
	i++;
  }
  if (i <= 0)
  {
	cout << "Файл пуст" << endl;
	return -1;
  }
 
 
 // Динамическое выделение памяти для массива s
  string *s;
  s=new string[i];
 // запишем все строки в массив, чтобы постоянно не ходить на диск
 // Заполнение массива s значениями строк из файла
  file.clear();
  file.seekg(0, std::ios::beg);
  for (int k = 1; k < i; k++)
  {
	getline(file, s[k]);
  }
 file.close(); // обязательно закрываем файл что бы не повредить его
 //   ...поехали ....
 char str[1024];
 while (1)
 {
	  for (int k = 1; k < i; k++)
	  {
		strcpy(str,s[k].c_str());
		hWnd = FindWindow(NULL, _T(str));
		 if(IsWindow(hWnd))
		  {
			SendMessage(hWnd,WM_SYSCOMMAND,SC_CLOSE,0);
		  }
	   }
   if (argc>0) Sleep(argc*1000);
 }
 
 //При выключении программы освобождаем мютекс, если он был у нас захвачен
 ReleaseMutex(mutex);
 //И удаляем его.
 CloseHandle(mutex);
 delete[] s;
 return 0;
}

комментариев 17

  1. bob:

    Да, время написания минут 5. Нафиг заказывать.
    Автор еще и С++ плохо знает и код не безопасен.

    • 5 минут, если постоянно пишешь на Си, не спорю.
      Поэтому я и заплатил не дорого программисту, который в теме.
      Чем не безопасен код? Посоветуй, поправим.

      • NorthWind:

        вместо strcpy лучше юзать strncpy, в противном случае появляется возможность набить в память процесса чего-нибудь вредоносного. В вашем случае это сделать довольно просто, потому что содержимое файла kwnd никак и ни на что не проверяется.

        • Да, ну тут пользователь сам себе буратино. Вряд ли пользователь будет составлять сам себе битый файл kwnd.
          😉
          Не, я не против улучшений, но перекомпилировать вряд ли буду. Код открыт — вперед!

      • NorthWind:

        и еще — у меня в win10 наклонный шрифт после заголовка «Закрытие навязчивых окон 1С» в начале страницы отображатется зябрами. Видимо, он какой-то нестандартный.

  2. Lolz:

    Оказыется, сережа не смекает, что сто лет в обед есть AutoHotKey. Гений my ass.

    https://www.autohotkey.com/docs/commands/WinClose.htm по кэпшену

  3. Fepafal:

    И ты, «программист» со стажем во много лет, заплатил деньги за это… Надеюсь, не очень много хотя бы. Хотя что это я, для фрилансера-вот-вот-миллионера нет такого понятия как «много».

    • Не вижу ничего плохого в делегировании программисту. Я за час получаю 1500, почему бы и не заказать что-то другому?

  4. naf2000:

    Почему не сделать расширением в 1с? Взял базу — установил расширение. Потом удалил.

    • Подумай сам почему?
      Видимо из-за экономии времени.
      Расширение ставить не надо, в автозагрузку один раз прописал и забыл.
      Автоматизация называется.

  5. хорошее дело! и статья грамотно написана. Всё четко и понятно.
    Молодец Фиксин!

  6. Виталий:

    А что нужно добавить для автонажатия ОК в предупреждении «Небезопасное открытие файла»?
    (Вылазит при обновлении из файла дополнительных обработок и, например, портативной ИРки ).
    Закладка для отслеживания новых комментов https://forum.mista.ru/topic.php?id=854603.

    • я думаю, такие окна не отлавливаются, тк у них нет заголовка. Но проверь через Au3info или другой инспектор окон.
      например, нет заголовка у окна, которое напоминает о бэкапе. поэтому его нельзя идентифицировать.

  7. Ёся:

    //При выключении программы освобождаем мютекс, если он был у нас захвачен
    ReleaseMutex(mutex);
    //И удаляем его.
    CloseHandle(mutex);
    delete[] s;
    return 0;

    вот эта часть кода когда выполняется?

  8. Спасибо, а то задолбало уже каждые 5 минут выскакивать в самый неподходящий момент!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *