Global Hotkeys

Καλό χειμώνα!

Πρώτο post για το καινούριο ακαδημαικό έτος και υπόσχομαι πολλά ενδιαφέροντα πράγματα, εφαρμογές καθώς και
κώδικα που θα μπορείτε να χρησιμοποιήσετε για να κάνετε την ζωή σας ποιό εύκολη αλλά και πιό ενδιαφέρουσα.

Αυτό τον καιρό φτιάχνω έναν desktop bing client και προσπαθώ να του βάλω features ώστε να τον κάνουν πιό ενδιαφέρον.
Ενδιαφέρον ώστε να προτημίσει ο χρήστης να κάνει το search του μέσω της εφαρμογής αντί να ανοιξει τον browser του
και να μπεί στο http://www.bing.com

Όπως ήμουνα με τον δημήτρη απο την σχολή σε ένα αργιλετζίδικο και συζητάγαμε για την εφαρμογή, μου είπε πως θα ήταν χρήσιμο
να μπορεί ο χρήστης με ένα shortcut, να εμφανίζεται η εφαρμογή ώστε να ψάξει αυτό που θέλει. Όντως συμφώνησα πως θα ήταν
πολύ χρήσιμο οπότε άρχισα να ψάχνω πως μπορώ να το υλοποιήσω.Ήδη είχα κάνει την εφαρμογή, με minimize να πηγαίνει ως notify icon
στην taskbar αντί για να φαίνεται ως εικονίδιο παραθύρου. Αυτό το έκανα σε περίπτωση που ο χρήστης ήθελε να αφήσει για αρκετή ώρα την εφαρμογή ελαχιστοποιημένη για κάποιο search που θα έκανε αργότερα, επομένως δε θα του έπιανε οπτικό χώρο στην taskbar.
Επομένως το να μπορεί με κάποιο hotkey να εμφανίζει την εφαρμογή ενώ εκείνη ήταν σε μορφή ενός notify icon θα του κέρδιζε χρόνο.

Το πρόβλημα, ήταν πως το hotkey που θα πάταγε ο χρήστης θα ήταν εκτός της εφαρμογής μου (αφού θα ήταν minimized) επομένως έπρε-
πε να βρώ τρόπο ώστε να “πιάσω” αυτό το hotkey. Με λίγο ψάξιμο, βρήκα πως στο user32.dll υπήρχε όντως μια συνάρτηση που σε “ειδοποιεί” για το hotkey που της έχεις πεί. Για την ακρίβεια, λέγονται global hotkeys τα hotkeys που “πιάνεις” εκτός εφαρμογής σου.
Όμως ο κώδικας στο dll είναι unmanaged και ή θα έπρεπε να γράψω εγώ μια C# κλάση που να τον κάνει wrap, η να βρώ κάποια έτοιμη
για να την αλλάξω λίγο, ή στην καλύτερη περίπτωση να έκανε εκριβώς αυτό που ήθελα. Για καλή μου τύχη την βρήκα έτοιμη, επομένως δεν
χρειάστηκε να χάσω χρόνο. Πάμε να δούμε την συμπεριφορά της κλάσης αυτής.

Λέγεται Hotkey, την κάνετε add στο project και με χρήση του namespace της μπορείτε να κάνετε αναφορά σε εκείνη χωρίς πρόβλημα, αφού πρώτα προσθέσετε το ManagedWinApi.dll.

Για αρχή, ορίζουμε το αντικείμενο HotKey και το αρχικοποιούμε, είτε εκεί που ο ορίσαμε, είτε στον constructor της κλάσης μας ή όπου εσείς κίνετε απαραίτητο:

image

Στη συνέχεια, θα ορίσουμε το συνδιασμό του Hotkey που θέλουμε να “ακούει” η εφαρμογή μας.
Η κλάση HotKey περιέχει τα properties Ctrl, Shift, Alt και Windows. Άν θέλετε η εφαρμογή να πιάνει
στον συνδιασμό κάποια απο αυτά τα Keys απλά κάνετε τα properties true. Μετά, στο propertie KeyCode,
θέτετε το αντικείμενο Key που θέλετε και θέτετε το propertie Enabled σε true όταν θέλετε να “ενεργοποιηθεί”
το global hotkey σας
. Κάπως έτσι:

image

Το μόνο που μας έμεινε είναι να κάνουμε subscribe την μέθοδο ή τις μεθόδους που θέλουμε να τρέξουν όταν ειδοποιηθούμε
πως πατήθηκε στο hotkey που ορίσαμε. Πολύ εύκολα και γρήγορα στον EventHandler HotkeyPressed του αντικειμένου Hotkey μας
ορίζουμε την μέθοδο που θέλουμε και στην συνέχεια γράφουμε το σώμα της:

image

image

Αυτό ήταν, πάμε να το δούμε και στην πράξη. Ελαχιστοποιούμε την εφαρμογή μας

image

image

Και πατάω Ctrl + Shift + B:

 

image

To BingIt επανήλθε και τοποθέτησε και τον έλεγχο στο TextBox που κάνουμε το search μας ώστε να ψάξουμε αυτό που θέλουμε.
Aνέβασα την κλάση εδώ και το dll ώστε να τα κατεβάσετε και να τα χρησιμοποιήσετε, ελπίζω να σας φανούν χρήσιμα :)

 

//το site που βρήκα την κλάση HotKey δυστυχώς δεν το θυμάμαι, θα ψάξω να το βρώ και θα το κάνω edit στο post

Share/Bookmark
Published Σάββατο, 26 Σεπτεμβρίου 2009 5:14 μμ by Panoylhs
Filed under: ,

Comments

# re: Global Hotkeys@ Σάββατο, 26 Σεπτεμβρίου 2009 9:40 μμ

Excellent mate !! Θα το χρησιμοποιήσω σύντομα !!

by solidus

# re: Global Hotkeys@ Σάββατο, 26 Σεπτεμβρίου 2009 11:19 μμ

,re: Global Hotkeys,dkloz,,Oooo egina diasimos..:p polu oreo pantws..:),Submit

# re: Global Hotkeys@ Κυριακή, 27 Σεπτεμβρίου 2009 1:56 πμ

Ωραίος!Η κοινή ονομασία για αυτά είναι system-wide hotkeys.Μερικές φορές ως global hotkeys αναφέρονται ένα άλλο διαφορετικό είδος hotkeys-τα οποία θέτονται σε ένα παράθυρο με το Windows message WM_SETHOTKEY και μόλις πατηθούν στέλνουν ένα μήνυμα για την ενεργοποίηση του εν λόγω παραθύρου.

Να προσθέσω κάτι όσον αφορά τα system-wide hotkeys:

Σε όλες τις εκδόσεις Windows μέχρι και τα XP το F12 είναι δεσμευμένο για τον debugger γι'αυτό να αποφεύγετε hotkeys που το χρησιμοποιούν.

Leave a Comment

(required) 
(required) 
(optional)
(required) 
Submit