Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.Visu­alBasic. 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:

  • ActivateAppli­cationByProcess (Process process) umožňuje aplikáciu obnoviť do pôvodného stavu.
  • ActivateAppli­cationByParti­alTitle (...) - 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 ActivateAppli­cationByProcess (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 ActivateAppli­cationByParti­alTitle (...)

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#

 

Všetky články v sekcii
C # - Pre pokročilých
Článok pre vás napísal zpavlu
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
C# , C++ a assembler
Aktivity