Použitie Windows API v C # .NET - 3. diel
Pre veľký záujem dávam k dispozícii pár príkladov API z mojej DB. Niekedy chceme bežiaci aplikáciu aktivovať, toto môže byť účelné potom, čo sme zabránili jej viacnásobnému spusteniu. Tu môžeme použiť metódu AppActivate z modulu Interaction zo jmeného priestoru Microsoft.VisualBasic. Táto metóda má však nedostatok, nevie minimalizovanú aplikáciu po aktivácii obnoviť do pôvodného režimu. Riešením tohto problému sú metódy:
- ActivateApplicationByProcess (Process process) umožňuje aplikáciu obnoviť do pôvodného stavu.
- ActivateApplicationByPartialTitle (...) - Mnohé aplikácie vypisujú v titulku okna okrem názvu aj ďalšie informácie, nie je je možné aktivovať podľa úplného titulku. Táto funkcia spracuje i časť titulku.
- GetWindowClassName () hľadá okno zo zadaným titulkom (môže sa použiť ako pomocná metóda)
Popis deklarovaných API
Aby sme mohli metódy implementovať, musíme najskôr deklarovať tieto Windows API:
Vyhľadá okno najvyššej úrovne s daným názvom triedy a názvom okna. Dcérska okná sa neprohledávají.
[DllImport("user32", SetLastError = true)] protected static extern int FindWindow(string lpClassName, string lpWindowName);
Používa sa na zistenie dĺžky titulku okna alebo textu ovládacieho prvku pred volaním GetWindowsText (). Funkcia zriaďuje vyrovnávaciu pamäť, ktorá je dostatočne veľká pre vyhľadaný text.
[DllImport("user32", SetLastError = true)] protected static extern int GetWindowTextLength(IntPtr hWnd);
Načítava titulok materských prekrývaných a dcérskych okien, alebo texom z ovládacieho prvku.
[DllImport("user32", SetLastError = true)] protected static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
Vynáša vlákno, ktoré dané okno vytvorilo na popredí a aktivuje okno, pričom mu dáva zvýraznenie pre vstup.
[DllImport("user32", SetLastError = true)] protected static extern int SetForegroundWindow(IntPtr hwnd);
Kontroluje, či je okno v danom okamihu zobrazené v minimalizovanom stave. To znamená, že aplikácia je v danom okamihu zobrazená iba ikonou.
[DllImport("user32", SetLastError = true)] protected static extern int IsIconic(IntPtr hwnd);
Obnovuje minimalizované okno do jeho pôvodnej veľkosti a pozície, potom okno tiež aktivuje.
[DllImport("user32", SetLastError = true)] protected static extern int OpenIcon(IntPtr hwnd);
Navracia názov triedy, s ktorou bolo dané okno vytvorené.
[DllImport("user32", SetLastError = true)] protected static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);
Nastavuje stav zobrazenia okna. Určuje, ako je okno zobrazené na obrazovke.
[DllImport("user32", SetLastError = true)] protected static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
Fukcie ActivateApplicationByProcess (Process process)
/// <summary> /// Aktivuje aplikaci pomocí objektu typu Process /// Pokud máme pro aplikaci object typu Process , popřípadě, když voláme metodu IsOtherInstanceRunning , /// můžeme tuto aplikaci dostat do popředí. /// </summary> /// <param name="process">Odkaz na objekt typu Process</param> /// <exception cref="Exception"> /// Vyvolá výjimku, když při obnově okna dojde k chybě, /// nebo když proces nemá žádné hlavní okno. /// </exception> public static void ActivateApplicationByProcess(Process process) { if ((int)process.MainWindowHandle != 0) //Získá popisovač okna hlavního okna přidruženého procesu { if (IsIconic((IntPtr)process.MainWindowHandle) != 0) //je okno minimalisované ?? { // Přenesení hlavního okna do popředí if (OpenIcon(process.MainWindowHandle) == 0) //dá se obnovit ? { throw new Exception("Chyba Windows " + Marshal.GetLastWin32Error() + " při obnovování " + "okna procesu " + process.ProcessName + "' z minimalizovaného stavu."); } } // Přenesení okna do popředí if (SetForegroundWindow(process.MainWindowHandle) == 0) { throw new Exception("Chyba Windows " + Marshal.GetLastWin32Error() + " při přenosu hlavního " + "okna procesu '" + process.ProcessName + "' do popředí"); } } else { throw new Exception("Proces '" + process.ProcessName + " nemá hlavní okno."); } }
Funkcie ActivateApplicationByPartialTitle (...)
public static void ActivateApplicationByPartialTitle(string mainWindowTitle, bool activaceDeactivace) { string errors = null; const int SW_MINIMIZE = 6; // Projdeme všechny procesy foreach (Process process in Process.GetProcesses()) { //Popisovač pouze pro okna v lokálním PC. Hlavní okno je vždy první okno bez ohledu zda má aplikace //více oken. Získá popisovač okna hlavního okna přidruženého procesu if ((int)process.MainWindowHandle != 0) { // Zjistíme délku textu hlavního okna int windowTextLength = GetWindowTextLength(process.MainWindowHandle); // Zjistíme text hlavního okna StringBuilder windowTextBuilder = new StringBuilder(windowTextLength + 1); if (GetWindowText(process.MainWindowHandle, windowTextBuilder, windowTextLength + 1) > 0) { // Zjistíme, zda se předaný text vyskytuje v textu aktuálního okna string windowText = windowTextBuilder.ToString(); string windowTextOpr = Left(windowText, mainWindowTitle.Length); //pokud se nerovná hodnotě -1 je tento řetězec nalezen if ((windowText.IndexOf(mainWindowTitle) > -1) & (windowTextOpr == mainWindowTitle)) { try { // Hledání okna s předaným titulkem a jménem třídy // Handle nalezené třídy windowHandle = FindWindow(null, windowText); if (activaceDeactivace) DeactivaceTitle(windowHandle, windowText); else ShowWindow((IntPtr)windowHandle, SW_MINIMIZE); return; } catch (Exception ex) { if (errors != null) { errors += Environment.NewLine; } errors += ex.Message; } }//if windowText }//GetWindowText }//(int)process }//foreach // Vyhodnocení chyb skok na globální odchyt modul Program.cs if (errors != null) { throw new Exception(errors); } { // Okno ze zadaným titulkem nebylo nalezeno throw new Exception("Okno s titulkem '" + mainWindowTitle + "' nebylo nalezeno"); } }//ActivateApplicationByPartialTitle
Funkcie GetWindowClassName (....)
public static string GetWindowClassName(string windowTitle) { int windowHandle = FindWindow(null, windowTitle); if (windowHandle != 0) { StringBuilder className = new StringBuilder(255); if (GetClassName((IntPtr)windowHandle, className, 255) > 0) { return className.ToString(); } else { throw new Exception("Chyba Windows " + Marshal.GetLastWin32Error() + "při zjišťování " + "jména třídy okna s titulkem '" + windowTitle + "'"); } } else { throw new Exception("Okno s titulkem '" + windowTitle + "' nebylo nalezeno"); } }
Zdrojové kódy priložené.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 82x (23.53 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#