Zakázání klávesových zkratek   otázka

VB.NET

Mohl by jste mi někdo prosím vás pomoci, potřeboval bych zakázat klávesové zkratky (Alt+F4/Esc/Tab, Alt+Ctrl+Del), přes události key press to nejde, řekl bych že je to tím, že wokna mají jakási "větší práva" k obsluze těchto zkratek a tudíž je nedovolí mému programu zrušit. Zkoušel jsem hledat snad všude (google: hodně vyslédků, málo řešení) vetšina jich je na VB6 a ty na VB.NET nefunguji, viděl jsem jedinej co disableoval alt+F4 ale k ničemu jinému se neměl. A pokud by to šlo tak bez zásahů do registru. Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Filtrovat tyto klávesy/kombinace kláves v rámci aplikace není až tak velký problém (pomocí přepsání chování metod Form.PreProcessControlMessage, Form.PreProcessMessage, Form.WndProc), ovšem filtrovat tyto klávesy na úrovni Windows je velice složitá záležitost kde se neobejdete bez dobré znalosti Win32 API.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

myslím že u mě bude asi ten příklad č. 1. Akorát nerozumím tomu

"pomocí přepsání chování metod Form.PreProcessControlMessage, Form.PreProcessMessage, Form.WndProc"

nevím jak to udělat :-o

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud si dobře pamatuji, k zakázání ctrl+alt+delete stačilo nějakou api funkcí Windowsu oznámit, že běží spořič obrazovky, tam ctrl+alt+delete nefunguje, ale nejsem si jistý, jestli to takhle funguje i na Windows 2000 a vyšších. Obávám se, že tyto klávesové zkratky jsou dosti hluboko v systému, aby nebylo jednoduché psát viry a "žertovné" aplikace, které pak nepůjdou vypnout. Na co to chcete, smím-li se ptáti?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dělám program do školy na výrobu a zpracování testů. Studentský program otevře soubor testu, je ve fullscreenua podřeboval bych aby student nemohl aplikaci ukončit (tu by ukončil učitel pomocí kódu, kerý zadá při vytváření tstu na svém programu) a vypracovávat test znovu, aby se nemohl přepnout např. do poznámek.

Popř by mi stačilo dočasné odpojení celé klávenice(softwareově) jelikož odpovědi jsou typu A,B,C,D pouze zaškrtávací. To jsem ale nasel pouze pomocí registrů a to by asi ve škole nebylo ono :) navíc to může dopadnou že už se nenačte ani po restartu...

Jestli máte nejáké jiné alternativní nápady, vřele je uvítám.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Napadá mě poměrně amatérské řešení, nicméně svůj účel by splňovalo. Nastavte FormBorderStyle = None, TopMost = True, WindowState = Maximized a v události FormClosing zajistěte aby se aplikace nedala ukončit. Výsledný efekt bude "fullscreen" okno které se nedá zavřít a při pokusu o přepnutí do jiné aplikace se nic nezobrazí protože okno je TopMost. Pro zpestření můžete například při ztrátě fokusu okna hlasitě přehrávat zvukový soubor :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jj tak to mám jediný co ne tak ošetřen ten FormClosing - ten přece reaguje až při zavírání a to už je pozdě ne? jinak zvukový soubor už mám dlouho staženy :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

FormClosing nastává při zavírání a dá se stornovat nastavením e.Cancel = True. FormClosed nastane po zavření.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No zkoušel jsem to hodit do kódu ale nefungovalo mi to, obyčejný End to zavřel i přes e.Cancel = True. Ono ješte když se vrátím tak sice mám form TopMost ale on spávce úloh (i dolní lišta - a to pak nevypadá nijak pěkně) má "ještě větší:)" TopMost takže jednoše zabijete process. jinak děkuji za ujasnění FormClosed a FormClosing.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

End i ukončení Správcem úloh je oboje násilné ukončení aplikace, tudíž se nevyvolá událost FormClosing. Vyvoláte-li End uprostřed bloku Try...Finally, neprovede se dokonce ani kód ve Finally. Jinak pro bezpečné ukončení aplikace se End nedoporučuje, použijte např. Form.Close()

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Třída Form obsahuje výše uvedené metody pro "low-level" zpracování zpráv. Ve vaší třídě odvozené od Form můžete přepsat standardní funkčnost těchto metod a napsat filtrování příslušných zpráv.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

už alespoň chápu princip "akce" :) ale nemám ponětí jak na to...no zkusim se stím nějak poprat...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Upravíte-li kód ze snipetů, máte uzavření aplikace zcela pod kontrolou:

Public Class Form1
  Private Sub Form1_FormClosing(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Dim UnloadMode As System.Windows.Forms.CloseReason = eventArgs.CloseReason
    Dim Cancel As Boolean = eventArgs.Cancel

    'Me.label1.Text = UnloadMode.ToString
    'eventArgs.Cancel = True (aplikace se nezavre)

    'Pokusy o zavreni programu z ruznych stran 
    If UnloadMode = CloseReason.ApplicationExitCall Then eventArgs.Cancel = True
    If UnloadMode = CloseReason.FormOwnerClosing Then eventArgs.Cancel = True
    If UnloadMode = CloseReason.MdiFormClosing Then eventArgs.Cancel = True
    If UnloadMode = CloseReason.None Then eventArgs.Cancel = True
    If UnloadMode = CloseReason.TaskManagerClosing Then eventArgs.Cancel = True

    'priklad dotazu po kliknuti na 'X'
    If UnloadMode = CloseReason.UserClosing Then
      Dim x As String
      x = MsgBox("Ukončit aplikaci?", vbYesNo, "Ukončení aplikace")
      If x = vbNo Then Cancel = True
      eventArgs.Cancel = Cancel
    End If

    If UnloadMode = CloseReason.WindowsShutDown Then eventArgs.Cancel = True
  End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Rozumím tomu dobře, že

If UnloadMode = CloseReason.UserClosing Then
      Dim x As String
      x = MsgBox("Ukončit aplikaci?", vbYesNo, "Ukončení aplikace")
      If x = vbYes Then Cancel = False
      eventArgs.Cancel = Cancel
    End If

aplikaci ukončí? a jestli ano ukončí ji ihned nebo jde ještě na ten poslední "If". Jinak, má nějaký důvod, že ten poslední "If" je na konci? Nebo klidně může být u těch ostatních. Ještě bych se chtěl zeptat na CloseReason.MdiFormClosing a na CloseReason.None. Jinak Mockrát Děkuji za příspěvek.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se, jestli jsem vás navedl špatně. Neřešil jsem celý váš problém (je většího rozsahu), pouze jsem uvedl příklad týkající se ukončování ze zdejších snippetů. Předpokládal jsem, že si kód do své aplikace upravíte podle potřeby.

Metoda FormClosing aplikaci neuzavírá. Naopak. Umožní uzavření ošetřit či zakázat. Proto proběhne celá a ovlivní další pokračování běhu programu.

Nechtěl jsem příklad předělávat, abych neodebral ukázku všech možností ukončování. Pro vás jsou veškeré podmínky zbytečné, když chcete totální zákaz ukončení. V metodě úplně stačí nastavit: eventArgs.Cancel = True

Protože však totální zákaz ukončení aplikace s FormClosing asi není možný (systém nepřemůže), kód snippetu je cenný pro pochopení problému:

http://vbnet.cz/snippet--21-rizene_zavir...

Informace výborně doplňuje p. Linhart též ve vláknu: http://vbnet.cz/forum-tema--742-zjisteni...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdá se mi, že se nezobrazují všechny příspěvky vlákna, tak to testuji...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

CloseReason.MdiFormClosing - máte-li uživatelské rozhraní MDI což je zjednodušeně řečeno jedno nebo více podřízených oken (MdiChildren) uvnitř hlavního okna (MdiParent) a toto hlavní okno je uzavřeno, nastane ve všech podřízených oknech událost FormClosing s argumentem CloseReason.MdiFormClosing. Např. reprezentuje-li každé podřízené okno jeden dokument, můžete tímto ošetřit zda-li uložit změny při zavření.

CloseReason.None - důvod uzavření okna není k dispozici, pravděpodobně vyhrazeno pro nějaké extrémní případy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za objasnění. Každopádně se mi zatím nepodařilo dosáhnout kýžených výsledků. Nejlepší by asi pro mě bylo jak softwarově odpojit klávesnici. Nemám tušení, ale podle mne to přece nějakým kouskem kódu musí jít. Jde o to vypojit ji jen v rámci aplikace a ne pomocí registru. Zavře se pomocí myši(číselný kód).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusil jsem, ale Windows XP nepřekonal (CTRL-ALT-DEL = Správce uloh, CTRL-ESC = nabídka... ), ale vzdoruje to dost.

Public Class Form1

  Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    FormBorderStyle = Windows.Forms.FormBorderStyle.None
    Me.SetClientSizeCore(Screen.PrimaryScreen.Bounds.Width, _
        Screen.PrimaryScreen.Bounds.Height)
    Me.Location = New System.Drawing.Point(0, 0)
    Me.ControlBox = False
    Me.ShowInTaskbar = False
    Me.TopMost = True
  End Sub

  Private Sub Form1_FormClosing(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.FormClosingEventArgs) _
    Handles Me.FormClosing
    e.Cancel = True
  End Sub

  Private Sub Form1_KeyDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    e.Handled = True
  End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

dekuji zkousel jsem se hnout pomocí me.showintaskbar = False ale on se v procesech stejnak objevi - leda by sel "vymazat" i tam...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když jsem Správci úloh odebral "Vždy navrchu", stalo se, že správce v aplikacích program neměl, šel nálezt a ukončit jedině přes procesy. Když Správce úloh "zapadnul" za program, pak mi nezbylo než vypnout počítač tlačítkem. To by nestačilo? Vždyť vypnout či resetovat počítač bude možné vždy, i kdyby program dokázal klávesnici zcela zakázat.

Možná by bylo snažší hledat nějakou utilitu, která umí klávesnici zamknout.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano to máte pravdu, jen se mi nepodařilo sundat taskbaru TopMost...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ze seznamu procesů pochopitelně vymazat nejde. Ale stále nechápu, proč pro aplikaci, která má zajišťovat testy, potřebujete, aby nešla ukončit?

Já osobně bych to řešil tak, že při startu aplikace se musí uživatel přihlásit, a při přihlášení stačí upozornit po síti učitele, že se uživatel přihlásil. Když to udělá v průběhu testu, je jasné, že aplikaci vypnul. I když na druhou stranu nevidím důvod, proč by ji nemohl vypnout, stačí zajistit, aby nemohl číst poznámky.

Nejjednodušší by bylo udělat to tak, že aplikace by kontrolovala třeba každých 10 sekund, jestli není spuštěn proces iexplore, firefox, opera, notepad, winword, wordpad atd., zkrátka vše, v čem mohou být poznámky. Pak ať si každý poznámky otevře, ale učitel to bude hned vědět.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Také jsem dělal trochu testů, ale na popisovaný problém jsem nenarazil. Zato na jiný - aby žáci mohli prostřednictvím aplikace číst a zapisovat do složky, ke které nemají žádná práva.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Každá aplikace má k dispozici spoustu míst, kam zapisovat může, např. Application Data atd. Pokud jde o testy, podle mě je nejlepší jak otázky, tak i odpovědi, udržovat někde na serveru, aby si prostě aplikace vyžádala ze serveru otázku a ihned po zodpovězení odeslala odpověď. Nehrozí tak žádné riziko, že by si uživatel někde "vyšťoural" zadání testu ještě před písemkou, a navíc odpadá složitá distribuce otázek na všechny počítače a zase odpovědí ze všech počítačů k učiteli.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"je nejlepší jak otázky, tak i odpovědi, udržovat někde na serveru" - ano, tak jsem řešil: otázky i odpovědi ve složce učitele na serveru, ale neuspěl jsem. Aplikace spuštěná žákem se do učitelské složky nedostane. Při zápisu do složky přístupné žákům samozřejmě žáci "vyšťourají", co se dá - odpovědi jiných, vzorovou odpověď učitele pro vyhodnocení (rovněž programem) až po škodné, co odpovědi jiných zmaří.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A kdo také říká, že mají být uložené ve složce a budou se číst přes sdílení složek, to je pak prakticky stejné, jako kdyby byly lokálně všude.

Podle mě by bylo nejlepší napsat server-klient aplikaci, učitel by si spustil server, který by si načetl soubory s otázkami od sebe, a žáci by si spustili klienty, kteří by si vždycky vyžádali ze serveru otázku a odeslali na něj po síti odpověď, prostě přes TCP/IP.

Anebo lze testovací program udělat jako webovou aplikaci a žáci si spustí webový prohlížeč, ale to by přitom koukali do poznámek, takže to asi ne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"budou se číst přes sdílení složek" - ne, sdílení složek není žádné, přístupy jsou řízeny uživatelskými právy. Nikdo ze zúčastněných není správcem serveru a nikdo z nich není ve skupině Administrator na stanicích. Na serveru jsou složky přístupné učitelům i žákům s právy číst, spouštět a zapisovat a složky přístupné jen učitelům s právy širšími o měnit (mazání souborů) - nic víc. Složky jsou namapované na části serverového disku, ke kterému přímý přístup nemá nikdo a nikdo ani neví, o který disk jde. Ani na stanicích nemají učitelé plný přístup k celému disku, nesmějí instalovat programy.

Učitelé mají možnost aplikaci kopírovat do učitelských i žákovských složek na namapovanou část disku serveru, mají možnost pomocí konfiguračního souboru určit složku se zadáním testu a složku pro zápis výsledků.

Napsat server-klient aplikaci mě nenapadlo, jednak to neumím a pak není výsledek jistý, protože tuším, že omezení práv by mohlo usilí zmařit. A problémů mám víc, např. má-li aplikace souborové dialogy, nedá se ze serveru spustit.

S díváním se do poznámek není problém, učitel je na učebně, je jeho starost si opisování ohlídat stejně jako při testech bez počítače.

Uváděné problémy jsem zde řešil na více místech a bez výsledku. Toto je vlákno na jiné téma. Omlouvám se za odvedení od něho. Kdyby chtěl někdo přispět k řešení, zkuste to, prosím, ke spouštění aplikací nakopírovaných do složky na serveru na:

http://www.vbnet.cz/forum-tema--171-beh_...

nebo k právům k zápisu na:

http://www.vbnet.cz/forum-tema--451-muze...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

mel jsem steny problem, a to ze neumim s TCP/IP jinak nemusi byt spusten u kantora zadny server. jinak vysledky se budou vyhodnocovat primo u studenta. A k drivejsimu prizpevku, aplikce se bude ukoncovat kodem(ciselnym).

Omluvte bezdiakriticnost, pisu z psp.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback