Diskuze: TopMost na určitém jednom okně
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
SPĚCHAL JSEM A SEPSAL JSEM TO JAKO HOTNTOT... TAKŽE JEŠTĚ JEDNOU...
Chci docílit toho aby se okno (říkejme mu window), překrylo vždy
specifickým oknem mojí aplikace (říkejme tomu form).
Každé window, má být překryto malým formem, který bude vždy ontop, když
bude platit podmínka:
if(window.Handle == GetActiveWindow())
//když bude window aktivní, tak se překryje malým oknem form
mám zajištěno handle window ...windowHandle
mám zajištěno handle formu ... formWindowHandle
Vždy, když se objeví nové window, tak se vytvoří třída, která se stará o malý okno form, které ho má překrýt. V každé této třídě je v konstruktoru initializer windowHandle a formWindowHandle... Dále je zde timer na 100ms a jeho částí timer.Tick += je tohle:
if (GetActiveWindow() == windowHandle)
{
//SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE
SetWindowPos(windowHandle, -2, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
SetWindowPos(formWindowHandle, -1, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
}
else
{
//SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE
SetWindowPos(windowHandle, -2, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
SetWindowPos(formWindowHandle, -2, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
}
Funguje to snad uplně stejně jako:
if (GetActiveWindow() == windowHandle)
{
TopMost = true;
}
else
{
TopMost = false;
}
Funguje to celkem dobře, ale má to jednu chybu a tou je, že když kliknu na více window, tak formy zůstávají stále on top. Paradoxně, když kliknu na horní lištu (titulek), tak to funguje jak chci, zobrazí to jen window a na tom form, ostatní window jsou vzadu i se svýma formama.
ZBYTEK A VYSVĚTLENÍ POMOCÍ NÁČRTU V PŘÍLOZE
PRVNÍ JE JAK TO JE, A DRUHÝ JE JAK TO CHCI
Nejlépe funguje tohle, myslel jsem, že to bude blikat, ale nebliká, takže v pohodě, jen to občas problikne kvůli frekvenci 100ms, takže by to chtělo nějákej event do konstruktoru, na změnu okna a tam připíchnout kód níže ať se to nemusí pořád obnovovat Nic takového ale neznám, zatím...
if (GetActiveWindow() == windowHandle)
{
//SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE
SetWindowPos(windowHandle, -1, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
SetWindowPos(formWindowHandle, -1, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
}
else
{
//SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE
SetWindowPos(windowHandle, -2, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
SetWindowPos(formWindowHandle, -2, 0, 0, 0, 0, 0x0010 | 0x0001 | 0x0002);
}
Zobrazeno 5 zpráv z 5.