Пятница - 23.04.2021 - 08:56:19
3571
0

Давно хотел написать руссификатор. Сам я с Украины и есть много полезных программ, но так как я учитель, то для учебного процесса нужно, чтобы программа была на родном языке. За основу взял программу из учебника Архангельского А.Я. Конечно, то что у меня получилось далеко от совершенства, но это скорее пример, чем готовое приложение - это основа, от которой можно оттолкнуться и написать серьезную программу. Поэтому выкладываю исходники, кто хочет может доработать программу, и в знак благодарности прислать мне доработанный вариант.

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

10. Управление чужими программами (руссификатор)

Что нужно, на мой взляд, для полноценного руссификатора:

1. Чтобы программа запускала то приложение, которое нужно руссифицировать, а сама закрывалась, «сделав свое дело».
2. Не знаю почему, но вкладки TPageControl не переименовываются.
3. Если есть несколько вкладок TPageControl, то компоненты, которые на них находятся можно определить в руссификаторе только после того, как пошелкать на вкладках. Почему?
4. Сохранять данные руссифицированной программы в файл.
5. В программе не реализована замена текста меню.
6. Если программа имеет несколько окон - предусмотреть это обстоятельство.

  1. На рисунке показан внешний вид программы.
  2. Чтобы начать работу необходимо запустить программу, которую хотим руссифицировать, потом запустить наш руссификатор. В текстовом поле сверху ввести название (Caption) программы предназначенной для руссификации. Нажать кнопку «Старт».
  3. Чтобы внести изменение текста в поле «Заменить текст окна на...» нужно щелкнуть раз и еще раз в нужной строке.
  4. В исходных кодах все подробно прокоментировано.

   //*****************************************************************
   //-----файл .срр --------------------------------------------------
   #include <vcl.h>
   #pragma hdrstop
   
   #include "UChildWin1.h"
   //------------------------------------------------------------------
   #pragma package(smart_init)
   #pragma resource "*.dfm"
   TForm1 *Form1;
   //-----------------------------------------------------------------
   __fastcall TForm1::TForm1(TComponent* Owner)
           : TForm(Owner)
   {
    n_item=0;
   }
   //-----------------------------------------------------------------
   char buf[256], buf2[256];

   //-----------функция определения компонентов на форме -------------
   bool __stdcall EnumChild(HWND hWind, LPARAM lParam)
   {
    //класс компонента формы
    GetClassName(hWind,buf2,sizeof(buf2));
    //текст компонента формы
    SendMessage(hWind, WM_GETTEXT, sizeof(buf), (LPARAM)(LPCTSTR)buf);
        
    if(Form1->add) //определить и записать данные компонента
    {Form1->ListView1->Items->Add();
     Form1->ListView1->Items->Item[Form1->n_item]->SubItems->Add(buf);
     Form1->ListView1->Items->Item[Form1->n_item]->SubItems->Add(buf2);
     Form1->n_item++;
    }
    else //изменить текст компонента
    {String classs,textnew,textold;
     for (int i=Form1->n_item;i<Form1->ListView1->Items->Count;i++)
     {Form1->n_item++;
      textold=Form1->ListView1->Items->Item[i]->SubItems->Strings[0];
      classs=Form1->ListView1->Items->Item[i]->SubItems->Strings[1];
      textnew=Form1->ListView1->Items->Item[i]->Caption;
   
      //если компонент без текста - выходим из цикла
      if(textold.IsEmpty()) {break;}
   
      //изменяем текст компонента и выходим из цикла
      if(classs==String(buf2))
      {SendMessage(hWind,WM_SETTEXT,sizeof(buf),(LPARAM)(LPCTSTR)textnew.c_str());
       break;}
      
     }
    }
    return true;
   }

   //-------------------------------------------------------------
   void __fastcall TForm1::ButtReplaceClick(TObject *Sender)
   {
    String text=Edit1->Text;
    HWND hWnd;
    //получение дескриптора окна
    if(!(hWnd == FindWindow(NULL,text.c_str())))
    {
     hWnd = FindWindow(NULL,text.c_str());
    }
    
    //заменить заголовок формы
    String textnew;
    textnew=ListView1->Items->Item[0]->Caption;
    SendMessage(hWnd,WM_SETTEXT,sizeof(buf),
                (LPARAM)(LPCTSTR)textnew.c_str());
   
    //заменить текст компонентов формы
    add=0;
    n_item=1;
    EnumChildWindows(hWnd, (WNDENUMPROC)EnumChild, 0);
   }
  
   //--------------------------------------------------------------
   void __fastcall TForm1::ButtStartClick(TObject *Sender)
   {
    ListView1->Clear();
    String text=Edit1->Text;
    HWND hWnd;
   
    // получение дескриптора окна
    if(!(hWnd == FindWindow(NULL,text.c_str())))
    {
     hWnd = FindWindow(NULL,text.c_str());
    }
   
    //определить заголовок формы
    SendMessage(hWnd, WM_GETTEXT, sizeof(buf), (LPARAM)(LPCTSTR)buf);
    GetClassName(hWnd,buf2,sizeof(buf2));
    ListView1->Items->Add();
    ListView1->Items->Item[0]->SubItems->Add(buf);
    ListView1->Items->Item[0]->SubItems->Add(buf2);
   
    //получение списка дочерних окна
    add=1;
    n_item=1;
    EnumChildWindows(hWnd, (WNDENUMPROC)EnumChild, 0);
    
    //определить меню формы
    Menu(hWnd);
   
    Label2->Caption="Записей: "+String(ListView1->Items->Count);
   }

   //---------------------------------------------------------------
   void __fastcall TForm1::Menu(HWND hWnd)
   {
    HMENU HM = GetMenu(hWnd);
    HMENU SubM = NULL;
    HMENU SubM2 = NULL;
    int CountM = GetMenuItemCount(HM); //колличесво MenuItem
    int CountS,CountS2;
    UINT *P;
    char *t;
    int couListV=ListView1->Items->Count;
    String strbuf;
    TReplaceFlags rflags=TReplaceFlags()<<rfReplaceAll;
    for(int i = 0; i < CountM; i++)
    {GetMenuStringA(HM, i, buf, sizeof(buf), MF_BYPOSITION);
      //удаление амперсанда
      strbuf=String(buf);

      strbuf=StringReplace(strbuf,"&","",rflags);
      
      //определить и записать MenuItem
      ListView1->Items->Add();
      ListView1->Items->Item[couListV]->SubItems->Add(strbuf);
      ListView1->Items->Item[couListV]->SubItems->Add("MenuItem");
      couListV++;
     if(SubM=GetSubMenu(HM, i)) //один знак = - это не ошибка
     { CountS = GetMenuItemCount(SubM);//колличество SubMenuItem
       for(int k =0; k < CountS; k++)
       {
        GetMenuString(SubM, k, buf, sizeof(buf), MF_BYPOSITION);
          // удаление амперсанда
          strbuf=String(buf);
          strbuf=StringReplace(strbuf,"&","",rflags);
   
          //определить и записать MenuSubItem
          ListView1->Items->Add();
          ListView1->Items->Item[couListV]->SubItems->Add(strbuf);
          ListView1->Items->Item[couListV]->SubItems->Add("MenuSubItem");
          couListV++;
   
        if(SubM2=GetSubMenu(SubM, k)) //один знак = - это не ошибка
        { CountS2 =GetMenuItemCount(SubM2);//колличество SubMenuItem
          for(int d =0; d < CountS2; d++)
          {
           GetMenuString(SubM2, d, buf, sizeof(buf), MF_BYPOSITION);
             // удаление амперсанда
             strbuf=String(buf);
             strbuf=StringReplace(strbuf,"&","",rflags);
   
             //определить и записать MenuSubItem
             ListView1->Items->Add();
             ListView1->Items->Item[couListV]->SubItems->Add(strbuf);
             ListView1->Items->Item[couListV]->SubItems->Add("MenuSubItem2");
             couListV++;
   
          }
        }
       }
     }
    }
   }
   
   //---------------файл .h-----------------------------------------
   
   #ifndef UChildWin1H
   #define UChildWin1H
   //---------------------------------------------------------------
   #include <Classes.hpp>
   #include <Controls.hpp>
   #include <StdCtrls.hpp>
   #include <Forms.hpp>
   #include <ComCtrls.hpp>
   #include <ExtCtrls.hpp>
   #include <Menus.hpp>
   //---------------------------------------------------------------
   class TForm1 :
   {
   __published:	// IDE-managed Components
           TPanel *Panel1;
           TEdit *Edit1;
           TButton *ButtStart;
           TButton *ButtReplace;
           TLabel *Label1;
           TMainMenu *MainMenu1;
           TMenuItem *N12311;
           TMenuItem *N12312;
           TMenuItem *N12313;
           TMenuItem *dasfa1;
           TMenuItem *N1;
           TMenuItem *N2;
           TLabel *Label2;
           TPageControl *pgc1;
           TTabSheet *TabSheet1;
           TListView *ListView1;
           void __fastcall ButtStartClick(TObject *Sender);
           void __fastcall ButtReplaceClick(TObject *Sender);
   private:	// User declarations
           void __fastcall Menu(HWND hWnd);
   public:		// User declarations
           __fastcall TForm1(TComponent* Owner);
           int n_item;
           bool add;
   };
   //-------------------------------------------------------------
   extern PACKAGE TForm1 *Form1;
   //-------------------------------------------------------------
   #endif
   //*************************************************************