0
Давно хотел написать руссификатор. Сам я с Украины и есть много полезных
программ, но так
как я учитель, то для учебного процесса нужно, чтобы программа была на родном
языке. За основу взял программу из учебника Архангельского А.Я. Конечно, то
что у меня получилось далеко от совершенства, но это скорее пример, чем готовое
приложение - это основа, от которой можно оттолкнуться и написать
серьезную программу. Поэтому выкладываю исходники, кто хочет может доработать
программу, и в знак благодарности прислать мне доработанный вариант.
Есть еще вариант использования этих знаний. Написать программу для быстрой вставки данных в текстовые поля чужих программ.
10. Управление чужими программами (руссификатор)
Что нужно, на мой взляд, для полноценного руссификатора:
1. Чтобы программа запускала то приложение, которое нужно руссифицировать, а сама закрывалась, «сделав свое дело».2. Не знаю почему, но вкладки TPageControl не переименовываются.
3. Если есть несколько вкладок TPageControl, то компоненты, которые на них находятся можно определить в руссификаторе только после того, как пошелкать на вкладках. Почему?
4. Сохранять данные руссифицированной программы в файл.
5. В программе не реализована замена текста меню.
6. Если программа имеет несколько окон - предусмотреть это обстоятельство.
- На рисунке показан внешний вид программы.
- Чтобы начать работу необходимо запустить программу, которую хотим руссифицировать, потом запустить наш руссификатор. В текстовом поле сверху ввести название (Caption) программы предназначенной для руссификации. Нажать кнопку «Старт».
- Чтобы внести изменение текста в поле «Заменить текст окна на...» нужно щелкнуть раз и еще раз в нужной строке.
- В исходных кодах все подробно прокоментировано.
//***************************************************************** //-----файл .срр -------------------------------------------------- #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 //*************************************************************
Полностью обновлены дизайн и структура сайта