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í.
Avatar
Dog
Člen
Avatar
Dog:8.11.2016 20:05

Ahoj, chtěl bych poradit, jak udělat topmost tak, aby se zobrazoval jen na určitém okně...

mám: handle mého formu (formWindowHandle) i okna na kterém chci mít topmost (windowHandle).

Když kliknu na okno (windowHandle), aby na něm vyskočil i form (formWindowHan­dle)... To dělá i kód, ale když kliknu na nějáké další okno (mimo titulek), tak ať už to, kde by se měl form zobrazit nebo ne, tak na něm zůstane původní form, kliknu li na titulek, tak se většinou původní form schová a zobrazí se to jak chci.

Kliknu na "windowHandle" a překryje se "formWindowHandle".
kliknu na "windowHandle2" a překryje se "formWindowHan­dle2", ale zůstane tam i "formWindowHandle", dokud nekliknu na "windowHandle2­.Titulek", což nechci,

Nechci, aby se formy schovávaly za okna, chci aby byly pořád na těch svých oknech, ale aby nepřekrývaly "windowHandle", kterým napatří.

Nevím jestli jsem to dobře sepsal, ten kód níže dělá v podstatě jen TopMost, myslel jsem, že to tím půjde vyřešit, protože je tam víc možností umisťování oken, ale nedaří se mi to zatím.

Timer (100ms).tick += code

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);
}
 
Odpovědět
8.11.2016 20:05
Avatar
Dog
Člen
Avatar
Dog:8.11.2016 22:48

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 :)

Editováno 8.11.2016 22:49
 
Nahoru Odpovědět
8.11.2016 22:48
Avatar
Dog
Člen
Avatar
Dog:8.11.2016 22:53

když se překlikávám z dolní lišty, tak to funguje jak chci, když otevřu jiný okno tak taky, problém je ale když mám otevřených více oken na ploše a kliku někam do jinýho (libovolnýho) okna, tak to zůstává jako na obrázku č.1, což je problém :(

 
Nahoru Odpovědět
8.11.2016 22:53
Avatar
Dog
Člen
Avatar
Dog:9.11.2016 0:55

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);
}
Editováno 9.11.2016 0:56
 
Nahoru Odpovědět
9.11.2016 0:55
Avatar
Dog
Člen
Avatar
Dog:11.11.2016 17:14

mimochodem překrývání určiteho okna jsem vyresil jedonoduse pomoci api fce.

SetWindowLong, ktere stoji samostatně

A eventy pomoci

SetWinEventHook

Editováno 11.11.2016 17:16
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
11.11.2016 17:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.