Avatar
Dog
Člen
Avatar
Dog:

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

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. listopadu 22:49
 
Nahoru Odpovědět 8. listopadu 22:48
Avatar
Dog
Člen
Avatar
Dog:

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. listopadu 22:53
Avatar
Dog
Člen
Avatar
Dog:

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. listopadu 0:56
 
Nahoru Odpovědět 9. listopadu 0:55
Avatar
Dog
Člen
Avatar
Dog:

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. listopadu 17:16
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 11. listopadu 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.