Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Tata programista...

Praca na własny rachunek niesie ze sobą wiele korzyści. Jedną z nich jest możliwość częstszego przebywania bliżej rodziny (o ile takową posiadamy). Praca na własny rachunek w charakterze programisty nakłada obowiązek posiadania co najmniej jednego komputera, który współdzielimy (bądź nie) z pozostałymi domownikami. Jeżeli tymi domownikami są małe dzieci - oj, strzeżcie się pliki i foldery, albowiem wasze dni zostały policzone.

Sam mam dwójkę pociech, synka i córeczkę. Och, ach :) Synek, z racji swojego wieku (2,5 roku) i zawodu taty, szybko rozwinął grupę zdolności psychofizycznych umożliwiających sprawne poruszanie się po zakamarkach Internetu. Jeśli przez przypadek pozostawię myszkę "luzem", już po paru chwilach ze zdumieniem obserwuję "kota kota Fimejona" skaczącego po ekranie i Bonifacego wylegującego się na babcinym zapiecku... Pięć kliknięć myszką i YouTube gra pełną parą :) Niech mu będzie.

Swego czasu, na potrzeby świetego spokoju, wskazałem synkowi ikonę do TuxPainta. Wywołało to w nim falę niespotykanej dotąd radości, tym bardziej, że poza samym malowaniem, program oferuje możliwość umieszczania na obrazkach tekstu. Klawiaturę opanował błyskawicznie. Tym większe było moje zdziwienie, kiedy synek, z "chronionego", pełnoekranowego trybu "Dla dzieci", powracał do Pulpitu - bo mu się malowanie znudziło - i rozpoczynał fragmentację moich programistycznych projektów. Ech...

Tylko dla wybranych (klawiszy...)

Ostatnio natrafiłem na stronę www.virtualpiano.net i zaprezentowałem znalezisko małemu psotnikowi. Zabawa niesłychana! Z tym, że gra na wirtualnym pianinie odbywa się za pomocą wybranych - a nie WSZYSTKICH klawiszy :P. Hmm, ale przecież tata zajmuje się tym czym zajmuje. Wziąłem więc synka na kolana i razem zabraliśmy się za pisanie "oprogramowania pomocniczego". Porady malucha były na tyle owocne, że już po kilkunastu minutach klawiatura została okiełznana, a program ukończony (kliknij tutaj, aby pobrać program).

Aplikacja wymaga .NET Framework 2.0 (Systemy Windows Vista i wyżej posiadają środowisko uruchomieniowe .NET w odpowiedniej wersji). Program blokuje przetwarzanie przez system operacyjny tych klawiszy, które nie znajdują się na "białej liście" (w uproszczeniu, ponieważ nie jest to do końca prawda). Jeśli do tego ukryjemy myszkę w sejfie, to możemy pozwolić naszym dzieciom na odrobinę zabawy z wykorzystaniem sprzętu komputerowego, bez konieczności nieustannego zerkania przez ramię.

Efekt końcowy jak na załączonym obrazku :)

Uwaga! Dzieci nie powinny spędzać przy komputerze dłużej niż 20 minut dziennie.

* w ofercie posiadam także inne programistyczne wynalazki dla rodziców małych pociech ;)

Poniżej załączam kod źródłowy (w wersji "wyścig z czasem"). Klasa InterceptKeys to zmodyfikowana implementacja mechanizmu haków w .NET Stephena Toub'a (http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx).

using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; namespace PreventKeys { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormKeys()); } } public class FormKeys : Form { Button buttonPreventKeys; public FormKeys() { this.Text = "Klawiatura dla psotnika"; this.StartPosition = FormStartPosition.CenterScreen; this.Size = new System.Drawing.Size(480, 150); RichTextBox allowableKeysRichTextBox = new RichTextBox(); allowableKeysRichTextBox.BorderStyle = BorderStyle.None; allowableKeysRichTextBox.BackColor = System.Drawing.Color.White; allowableKeysRichTextBox.ReadOnly = true; allowableKeysRichTextBox.Dock = DockStyle.Fill; InterceptKeys.AllowableKeysRichTextBox = allowableKeysRichTextBox; allowableKeysRichTextBox.GotFocus += new EventHandler(allowableKeysRichTextBox_GotFocus); allowableKeysRichTextBox.LostFocus += new EventHandler(allowableKeysRichTextBox_LostFocus); buttonPreventKeys = new Button(); buttonPreventKeys.Text = "Zablokuj pozostałe klawisze"; buttonPreventKeys.Dock = DockStyle.Bottom; buttonPreventKeys.Click += new EventHandler(buttonPreventKeys_Click); Label label = new Label(); label.Text = "Kliknij myszką na poniższym polu i naciśnij klawisze, które mają być dostępne dla dziecka"; label.AutoSize = true; label.Padding = new System.Windows.Forms.Padding(4); label.Dock = DockStyle.Top; this.Controls.Add(allowableKeysRichTextBox); this.Controls.Add(label); this.Controls.Add(buttonPreventKeys); Application.ApplicationExit += new EventHandler(Application_ApplicationExit); } void allowableKeysRichTextBox_LostFocus(object sender, EventArgs e) { InterceptKeys.UnHook(); InterceptKeys.HookMode = InterceptKeys.Mode.PreventOtherKeys; } void allowableKeysRichTextBox_GotFocus(object sender, EventArgs e) { buttonPreventKeys.Text = "Zablokuj pozostałe klawisze"; buttonPreventKeys.Tag = null; InterceptKeys.UnHook(); InterceptKeys.HookMode = InterceptKeys.Mode.PrepareAllowableKeys; InterceptKeys.Hook(); } void buttonPreventKeys_Click(object sender, EventArgs e) { Button button = sender as Button; if (button.Tag == null) { InterceptKeys.Hook(); button.Text = "Odblokuj wszystkie klawisze"; button.Tag = true; } else { InterceptKeys.UnHook(); button.Text = "Zablokuj pozostałe klawisze"; button.Tag = null; } } void Application_ApplicationExit(object sender, EventArgs e) { InterceptKeys.UnHook(); } } public static class InterceptKeys { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); public enum Mode { PrepareAllowableKeys, PreventOtherKeys } public static Mode HookMode { get; set; } public static RichTextBox AllowableKeysRichTextBox { get; set; } public static void Hook() { _hookID = SetHook(_proc); } public static void UnHook() { UnhookWindowsHookEx(_hookID); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); string keyName = Enum.GetName(typeof(Keys), vkCode); bool found = false; // Uuuu, ale nieefektywny sposób :) // A ile pamięci marnujemy... Dobrze, że GC działa jak należy... // Nie ma czasu na zabawę w wyrażenia regularne... string[] split = AllowableKeysRichTextBox.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < split.Length; ++j) { if (split[j] == keyName) { found = true; break; } } if (HookMode == Mode.PrepareAllowableKeys) { if (!found) AllowableKeysRichTextBox.Text += String.Format("{0} ", keyName); else return new IntPtr(1); } else { if (found) return CallNextHookEx(_hookID, nCode, wParam, lParam); else return new IntPtr(1); } } return CallNextHookEx(_hookID, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); } }

 

windows oprogramowanie programowanie

Komentarze

0 nowych
djfoxer   17 #1 06.06.2012 13:01

Widzę, że planujesz stworzenie rodzinnego interesu, już młode pokolenie powoli wdraża się ;)

gowain   18 #2 06.06.2012 13:38

Eh a za naszych czasów taką radość, jak ta ze zdjęcia, sprawiał zegarek :P Jak możesz to dawaj więcej takich programików, trzeba je chomikować, bo nigdy nie wiadomo kiedy się przydadzą :P

alucosoftware   7 #3 06.06.2012 13:44

Wdraża to za mało powiedziane :)

Zabawnie jest obserwować dziecko, które próbuje się przedostać przez ekran logowania nie znając hasła... najpierw coś klepie na klawiaturze, potem zatwierdza kilkukrotnie błędne hasło i z utęsknieniem czeka na jego akceptację, następnie próbuje wykorzystać opcję Zresetuj hasło ("Mikołaj naciśnie tu!", "nie daa raaaaady", "wyłoczoooony komputer, wyłoczoooony") itd. ;)

alucosoftware   7 #4 06.06.2012 13:51

@gowain
Ostatnio musiałem programowo zablokować tackę napędu DVD, bo pierwsza kołysanka na liście biła rekordy popularności ;)

A wspomnianego TuxPainta "rozszerzyłem" o zamykanie Eksploratora Windows i jego ponowne uruchamianie po zakończonej zabawie w malarza. Takie drobnostki, ale bardzo przydatne...

djfoxer   17 #5 06.06.2012 14:24

@alucosoftware
Mógłbyś opisać takie wynalazki dla rodziców małych dzieci. Jeśli całość będzie w paczce z prostym interfejsem i za rozsądną cenę, myślę, że znalazło by się wielu klientów do zakupu takiego zbioru aplikacji :)

djDziadek   16 #6 06.06.2012 14:59

Ja też mam dwie pociechy - syna 9 i córkę 3,5, znalazłem łatwiejszy sposób na okiełznanie gagatków przy komputerze, a właściwie dwa sposoby:

1. na komputerze tzw. współdzielonym, jest stworzony profil użytkownika, który nie może zrobić nic bez zatwierdzenia przez administratora w dodatku z kontrolą godzin możliwości użytkowania (system Win 7)

2. do pracy mam swój komputer, do którego gawiedź nie ma dostępu :)

Ale każdemu w/g potrzeb i umiejętności :)

Co do pisanych przez Ciebie @alucosoftware programów - jestem za tym, aby dzielić się takimi rzeczami, jednak czy odpłatnie, czy nie, to już wola autora :)

alucosoftware   7 #7 06.06.2012 15:26

@djfoxer
Ciii! Bo jeszcze ktoś pomysł podchwyci! To napisz interfejs i dokumentację - a ja zrobię resztę ;)

@djDziadek
No przecież się podzieliłem :) nawet tajemnym kodem źródłowym...

Ale tak realnie patrząc. Aplikacje tego pokroju powinny być bezpłatne i dostępne od ręki w systemie operacyjnym.

parasite85   7 #8 06.06.2012 15:34

@alucosoftware
Jasne, że powinny, ale skoro nie są to zawsze możesz zarobić na tym parę groszy. Przy odpowiedniej reklamie nic nie stoi na przeszkodzie, abyś inkasował za paczuszkę parę groszy - powiedzmy 20-30 złotych nikogo nie zbawi, a wynagrodzi Twoją pracę:)

alucosoftware   7 #9 06.06.2012 15:56

@parasite85
Rozumiem Twoje i kolegów dobre intencje, ale aż mnie korci o wpis "Efektywność ekonomiczna jednoosobowych (programistycznych) projektów IT w państwie polskim"

Piterson79   2 #10 06.06.2012 17:54

Tak to jest z dziećmi. Strasznie szybko chwytają.
Mój starszy syn (8 lat), dzięki zabawie "za moimi plecami" opanował Zbrusha.
Może nie jakoś tam perfekcyjnie, ale pierwsze modele już tworzy :)
W Illustratorze i Painterze też sobie nieźle radzi.
Profity posiadania taty grafika w domu :)

Zarafa   1 #11 06.06.2012 19:06

gdy ja miałem 8 lat, uczyłem się programowania w assemblerze, oraz trochę HTML, nie żałuję tego nawet teraz gdy mam 16, lat ;]

djDziadek   16 #12 06.06.2012 19:18

To może ja też opiszę profity z posiadania taty serwisanta w domu ;)

alucosoftware   7 #13 06.06.2012 19:21

@Piterson79
A za parę lat, kiedy się zbuntują, to ani grafikami ani programistami nie zostaną :)

Ale niech im będzie :P

  #14 06.06.2012 19:22

Witam, pytanie może luźno związane z tematem, ale który fragment kodu odpowiada za ukrycie konsoli?

alucosoftware   7 #15 06.06.2012 22:24

@MiszczuOfWorld
Nie jest to aplikacja konsolowa, więc takiego fragmentu nie znajdziesz. Jest to aplikacja Windows Forms.

  #16 06.06.2012 23:44

bardzo ciekawy wpis. dzieki za apke i źrodlo

przemor25   14 #17 07.06.2012 01:02

Fajny wpis :)) Może na blogu DP wytworzy się kącik małego programisty :)

przemor25   14 #18 07.06.2012 01:03

Mi moja chrześnica rozwaliła jedną klawiaturę :P

alucosoftware   7 #19 07.06.2012 08:41

@dżonny
Dzięki.

@przemor25
Dzięki. Kto wie, chociaż szczerze mówiąc wolałbym, aby komputer stanowił dodatek a nie główny element codziennego życia malucha :P

kamil_w   10 #20 07.06.2012 11:04

Swego czasu pracowałem w serwisie sprzętu komputerowego, teraz zajmuję się programowaniem. Swoich dzieci jeszcze nie mam, ale mam 3-letnią chrześnicę i 14-miesięcznego chrześniaka. Dzieciaki strasznie szybko zaczęły lgnąć do moich komputerów. Z tego względu musiałem co nieco pokombinować.
- pracuję na koncie z ograniczeniami, żeby mi przypadkiem maluchy czegoś nie usunęły,
- foldery z plikami z pracy mają dostęp ograniczony tylko do admina,
- pliki admina przeglądam poprzez Total Commandera, który uruchamiam jako inny użytkownik (admin) z koniecznością podania hasła,
- itp itd.

Ze stacjonarnego komputera wymontowałem napęd optyczny. Jakoś nie korzystam z tego, a chrześniak zauważył, że da się wysunąć tackę. Pół biedy, gdyby on ją tylko wysuwał i wsuwał, ale on zaczął próbować chować do napędu optycznego różne rzeczy (w tym owoce).

Najbardziej dumny z siebie jestem z tego powodu, że nauczyłem już chrześnicę, że o ile z komputera stacjonarnego może korzystać, to na laptopa nawet nie może spojrzeć. :D Niestety chrześniak jest jeszcze za mały, ale i na niego przyjdzie czas.

yuwo   7 #21 07.06.2012 16:16

@kamil_w

Z doświadczenia wiem, że do tacki na cd/dvd dużo różnych rzeczy wchodzi.... A jak przyjemność jak wyczyścisz i wszystko działa :-)

  #22 08.06.2012 10:17

hej, czytam sobie zrodlo i mam pytanie czemu zwracasz w hookcallback intptr(1)?

  #23 08.06.2012 10:20

i jeszcze jedeno, nie lepiej bylo użyć eventu keydown, zeby wprowadzić klawisze?

djfoxer   17 #24 08.06.2012 10:57

@alucosoftware
Dokumentacja i interface, no tak to widzę, że mnie nie lubisz :P Już nic gorszego nie mogłeś mi dać ;) Hehehe.

A co masz jeszcze ciekawego w swojej ofercie dla rodziców? Mógłbyś tak ogólnie przedstawić?

alucosoftware   7 #25 08.06.2012 11:32

@dżonny
Za MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx):

"...If the hook procedure processed the message, it may return a NONZERO VALUE to prevent the system from passing the message to the rest of the hook chain or the target window procedure."

Niezbyt elegancko to zinterpretowałem, prawda? :)

Jeżeli zaś chodzi o pytanie drugie - spróbuj wyświetlić np. "kod" klawisza Lewy Shift, Page Up lub innego w kodzie "niezarządzanym" (funkcja HookCallback) oraz w .NETowym zdarzeniu KeyDown, a szybko zrozumiesz przyczyny takiego rozwiązania.

Pozdrawiam

alucosoftware   7 #26 08.06.2012 11:38

@djfoxer
Nie to, że nie lubię :)

Muszę przejrzeć moje stare repozytorium :P

Postaram się odpisać wieczorem.

alucosoftware   7 #27 08.06.2012 12:34

@djfoxer
Wróć... przecież dzisiaj gramy w nogę, po 15-stej laptop leci do kosza...

djfoxer   17 #28 08.06.2012 14:52

@alucosoftware
True. To jak już ockniesz się któregoś dnia po meczu to z chęcią przeczytam co tam masz w ofercie ;)

  #29 09.06.2012 11:35

Programik fajny na pewno się przyda. Tylko tytuł wpisu nie mówi, że taki program tu znajdę, reszta ok.

alucosoftware   7 #30 10.06.2012 21:55

@Anonim
A widzisz... nagrody są dla wytrwałych, którzy w gąszczu wielu dostępnych treści skrupulatnie przeglądają wszystkie tematy, a nie tylko te z porywającymi tytułami :)