Springe zum Inhalt

The Windows API does not provide a simple function to create a list of all top-level windows according to the Alt-Tab list. The EnumWindows function provides many more windows, as most programs have multiple windows. But at most one of them belongs in the Alt-Tab list. To find the right one, you have to go down the owner chain for each window until you find the root owner. If the tested window equals the LastActivePopup it additionally must meet certain criteria to be included in the Alt-Tab list. Thus you can create a list of window handles appearing in the Alt-Tab list and sorted by Z-order.

The following code demonstrates the procedure for C-Sharp. In this example the loop breaks as soon as the last active window is found. exclHwnd may be the handle of the form (this.Handle = ActiveHwnd) that uses the code.

private static ArrayList windowHandles = new ArrayList();
 
public static IntPtr GetLastWinHandle(IntPtr exclHwnd)
{
    IntPtr indexHwnd = IntPtr.Zero;
    IntPtr ownerHwnd = IntPtr.Zero;
    IntPtr foundHwnd = IntPtr.Zero;
    windowHandles.Clear();
    EnumWindows(new EnumWindowsCallback(EnumCallback), 0);
    foreach (int i in windowHandles)
    {
        indexHwnd = new IntPtr(i);
        if (IsWindowVisible(indexHwnd) && indexHwnd != exclHwnd)
        {
            ownerHwnd = indexHwnd;
            do
            {
                ownerHwnd = GetWindow(ownerHwnd, GW_OWNER);
            } while (!IntPtr.Zero.Equals(GetWindow(ownerHwnd, GW_OWNER)));
            ownerHwnd = ownerHwnd != IntPtr.Zero ? ownerHwnd : indexHwnd;
            if (GetLastActivePopup(ownerHwnd) == indexHwnd)
            {
                int es = GetWindowLongPtr(indexHwnd, GWL_EXSTYLE);
 if ((!(((es & Win32andMore.WS_EX_TOOLWINDOW) == Win32andMore.WS_EX_TOOLWINDOW) && ((es & Win32andMore.WS_EX_APPWINDOW) != Win32andMore.WS_EX_APPWINDOW))) && !IsInvisibleWin10BackgroundAppWindow(indexHwnd))
                {
                    foundHwnd = indexHwnd;
                    break;
                }
            }
        }
    }
    return foundHwnd;
}
 
private static bool EnumCallback(int hWnd, int lParam)
{
    windowHandles.Add(hWnd);
    return true;
}
 
private bool IsInvisibleWin10BackgroundAppWindow(IntPtr hWindow)
{
    int cloakedVal;
    int hr = Win32andMore.DwmGetWindowAttribute(hWindow, Win32andMore.DWMWA_CLOAKED, out cloakedVal, sizeof(int));
    if (hr != 0) // returns S_OK (which is zero) on success. Otherwise, it returns an HRESULT error code
    {
         cloakedVal = 0;
    }
    return cloakedVal != 0 ? true : false;
}

Downloads

This demo application shows all window titles in a listview and allows to toggle between the last two windows by tapping the Right Windows Key. Read the "WinCycle.Readme.txt" if you want to use a different key.

License

This article, along with any associated source code and files, is licensed under the BSD License.

Move and Link to MEDISTAR

MEDISTAR bietet eine interessante, aber un­doku­men­tierte Funktion: in den med. Daten lassen sich Ver­knüp­fungen zu beliebigen externen Dateien erstellen. Diese lassen sich dann durch einen Doppel­klick öffnen.

Konkret muss eine Schrägstrich-Zeile angelegt wer­den und ein Eintrag entsprechend der folgenden Syntax eingeben werden:
EV:<D:\datei.txt>

«Move and Link to MEDISTAR» ist ein ist ein Hilfs­pro­gramm für das Anlegen solcher Ver­knüp­fungen. Datei­pfade werden einfach aus dem Windows-Explorer auf­ge­nom­men und in MEDISTAR eingetragen.

Weitere Funktionen:

  • Dateien werden automatisch in einen Sammel­ordner auf dem Server verschoben oder kopiert. Wenn dessen Pfad als UNC-Netz­werkpfad an­gegeben wird, ist der Pfad auf allen Arbeits­plätzen identisch:
    \\Servername\Freigabename\Pfad.
  • Auf Wunsch werden Dateinamen beim Kopieren oder Verschieben automatisch umbenannt. Doppelte Dateinamen werden dadurch zuverlässig verhindert.
  • Ein bestimmter Ordner kann auto­matisch überwacht werden. Sobald in diesem Ordner Dateien eintreffen, startet das Pro­gramm.

Das Programm ist Freeware/OpenSource.
Es setzt das Microsoft .NET Framework ≥ 2.0 voraus (standardmäßig auf jedem Windows-PC vorhanden).

Download

Laden Sie "MoLiStarSetup.exe" von der GitHub-Seite: