C# - Tetszőleges alkalmazás felületén található kontrolok szövegeinek kigyűjtése

forráskód letöltése
A .NET Framework osztályaiban implementált metódusokkal nagyon sok információ szerezhető tetszőleges futó alkalmazásokról. Azonban abban az esetben, ha egy alkalmazás esetében arra vagyunk kíváncsiak, hogy a megjelenő dialógusablakban található vizuális kontrolok milyen szöveges információkat hordoznak, akkor Windows API metódusokat kell használnunk. Cikkünkben bemutatjuk, hogy melyek ezek a metódusok, és hogyan végezhető el a művelet.
A mellékelt példa két projektet tartalmaz. Az FCServer projekt tartalmazza a „szerver” alkalmazást, melynek Form-jára kontrolokat helyeztünk el, és amelyek szövegeit ki fogjuk olvasni a hívó alkalmazásban.
A megoldáshoz szükséges API metódusok deklarációja a Win32 osztályban található. Ezek a következő funkciókat végzik el:
  • FindWindow: a megadott osztállyal, vagy ablakfelirattal bíró ablak azonosítóját adja meg.
  • EnumChildWindows: a megadott azonosítóval rendelkező ablak gyermekablakait, illetőleg gyermekkontrolljait gyűjti ki egy visszahívás (callback) metódus segítségével.
  • GetWindowText: A megadott azonosítóval rendelkező ablak, jelen esetben kontrol szöveges információját adja vissza.
  • GetClassName: A megadott azonosítóval rendelkező ablak, jelen esetben kontrol nevét adja vissza.
A Form egyik nyomógombja segítségével elindíthatjuk a FCServer.exe alkalmazást. A MŰVELET gomb segítségével pedig a elindíthatja a kontrolok adatainak lekérdezését. Ekkor a futó folyamatok ablakai között megkeressük a FCServer.exe alkalmazás főablakának azonosítóját.
hWnd = Win32.FindWindow(null,"Kontrol ablak");
Amennyiben ez megvan, akkor a kontrolok adatainak listázása következik. Mivel az EnumChildWindows metódus számára egy statikus függvényt kell átadnunk, nem adhatjuk az elemek információinak karakterláncait közvetlenül a Listbox kontrolba. Ezt megkerülendő egy szöveges állományba másoljuk ki az adatokat, majd onnan olvassuk be a kontrolba. Ehhez szükségünk van egy állományra.
FileStream fs = File.Create(Application.StartupPath + "\\Datas.txt");
fs.Close();
Meghívjuk a kigyűjtő API metódust.
Win32.EnumChildWindows(hWnd,cb,0);
Majd amikor végzett, akkor beolvassuk a már legenerált állomány adatait.
StreamReader sr = new StreamReader(Application.StartupPath + "\\Datas.txt");
string l = sr.ReadLine();
while (l != null)
{
  listBox1.Items.Add(l);
  l = sr.ReadLine();
}
sr.Close();
Az átadott callback objektum egy delegált, mely a GetValues metódusra mutat.
public delegate int Callback(int hWnd,int lParam);
Callback cb = new Callback(GetValues);
A metódus az adott gyermekkontrol azonosítóját kapja paraméterként, melynek felhasználásával meghatározható a kontrol szövege, és osztálya.
StringBuilder sb = new StringBuilder(256);
StringBuilder sb1 = new StringBuilder(256);
Win32.GetWindowText(hWnd,sb,sb.Capacity);
Win32.GetClassName(hWnd,sb1,sb1.Capacity);
A kapott adatokat úgy helyezzük el az állományban, hogy először annak tartalmát beolvassuk egy listába, a listát kiegészítjük az új adatokkal, majd az egészet egyben kiírjuk az állományba.
A művelet végén az adatok olvashatók a ListBox kontrolban.