IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Avancé][keyboard] evènements clavier dans le système


Sujet :

API standards et tierces Java

  1. #1
    Membre éprouvé
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Points : 1 210
    Points
    1 210
    Par défaut [Avancé][keyboard] evènements clavier dans le système
    Salut à tous,

    J'aimerais pouvoir dans une application tournant en tâche de fond (comme un service par exemple - donc pas de Swing) pouvoir récupérer les évènements clavier (telle la classe KeyListener) donc pouvoir placer un écouteur au niveau OS pendant que l'application tourne en tâche de fond (donc pas de focus). Vous auriez une idée de comment je dois aborder la chose ?

    merci d'avance !

    @++
    Libzippp (C++)
    Lost in AStorm

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Avec JNI. C'est un peu complique sous Windows car il faut creer une DLL avec son propre espace d'addressage memoire et definir des instances partagees avec des directives du compilateur.

    Exemple de code qui intercepte les evenement clavier n'importe ou dans le systeme pour piloter iTunes.

    L'application principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ///////////////////////////////////////////////////////////////////////////
    // INCLUDES
    ///////////////////////////////////////////////////////////////////////////
    #include "Trinklet.h"
     
    ///////////////////////////////////////////////////////////////////////////
    // MAIN ENTRY POINT
    ///////////////////////////////////////////////////////////////////////////
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow) {
    	MSG msg;
     
    	CoInitialize(0);
    	Trinklet_InstallHook(GetCurrentThreadId());
     
    	while (GetMessage(&msg, NULL, 0, 0)) {
    		if (msg.message == WM_DESTROY) {
    			break;
    		}
    	}
     
    	Trinklet_UnInstallHook();
    	CoUninitialize();
     
    	return 0;
    }
    Et la DLL responsable de la gestion des touches. Note les instances partagees definies dans la section GLOBALS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    /* Copyright (c) 2005 Romain Guy <romain.guy@mac.com>
     * All rights reserved.
     * 
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     * 1. Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     * 2. Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     * 3. The name of the author may not be used to endorse or promote products
     *    derived from this software without specific prior written permission.
     * 
     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
     
    ///////////////////////////////////////////////////////////////////////////
    // INCLUDES
    ///////////////////////////////////////////////////////////////////////////
    #include "TrinkletGlobalKeys.h"
     
    //////////////////////////////////////////////////////////////////
    // GLOBALS
    //////////////////////////////////////////////////////////////////
    // Dev-C++/mingw/gcc win32
    #ifdef _DEVCPP
    HHOOK        g_hHook     __attribute__((section ("shared"), shared)) = NULL;
    HINSTANCE    g_hInstance __attribute__((section ("shared"), shared)) = NULL;
    DWORD        g_threadId  __attribute__((section ("shared"), shared)) = 0;
    // Visual Studio
    #else
    #pragma comment(linker, "/SECTION:.SHARDATA,RWS")
    #pragma data_seg(".SHARDATA")
    HHOOK        g_hHook     = NULL;           // handle to the hook
    HINSTANCE    g_hInstance = NULL;           // handle to the current DLL instance
    DWORD        g_threadId  = 0;              // handle to application thread ID
    #pragma data_seg()
    #endif
     
    pTrinkletKeyCodes g_keysConf  = NULL;      // handle to keys configuration
     
    //////////////////////////////////////////////////////////////////
    // HOOKS
    //////////////////////////////////////////////////////////////////
    // keyboard hook, system wide
    LRESULT CALLBACK Trinklet_KeyboardHook(int nCode,
    									   WPARAM wParam,
    									   LPARAM lParam) {
    	if (nCode == HC_ACTION)	{
    		// Ctrl+Alt+[A key]
    		// if the key wasn't down before this call, we skip the message
    		if (GetAsyncKeyState(VK_CONTROL) &&
    			GetAsyncKeyState(VK_MENU) &&
    			!(lParam & 0x040000000)) {
     
    			CComPtr<IiTunes> app;
    			HRESULT hr = app.CoCreateInstance(CLSID_iTunesApp);
    			if (hr == S_OK) {
    				UINT scanCode   = MapVirtualKeyEx(wParam, 0, GetKeyboardLayout(0));
     
    				if (g_keysConf == NULL) {
    					g_keysConf = Trinklet_SetupKeys();
    				}
     
    				if (scanCode == g_keysConf->previous) {
    					app->PreviousTrack();
    				} else if (scanCode == g_keysConf->play) {
    					app->Play();
    				} else if (scanCode == g_keysConf->pause) {
    					app->Pause();
    				} else if (scanCode == g_keysConf->stop) {
    					app->Stop();
    				} else if (scanCode == g_keysConf->next) {
    					app->NextTrack();
    				} else if (scanCode == g_keysConf->shutdown) {
     
    				} else if (scanCode == g_keysConf->exit) {
    					PostThreadMessage(g_threadId, WM_DESTROY, 0, 0);
    				}
    			}
    		}
    	}
     
    	return CallNextHookEx(g_hHook, nCode, wParam, lParam);
    }
     
    // installs the hook
    HOOKDLL_API BOOL Trinklet_InstallHook(DWORD threadId) {
    	if (g_hHook == NULL) {
    		g_hHook    = SetWindowsHookEx(WH_KEYBOARD,
    										(HOOKPROC) Trinklet_KeyboardHook,
    										g_hInstance, 0);
    		g_threadId = threadId;
    	}
     
    	return (BOOL) (g_hHook != NULL);
    }
     
    // uninstalls the hook
    BOOL HOOKDLL_API Trinklet_UnInstallHook() {
    	BOOL resultOk = TRUE;
     
    	if (g_hHook != NULL) {
    		resultOk = UnhookWindowsHookEx(g_hHook);
    		g_hHook = NULL;
    	}
     
    	return resultOk;
    }
     
    // handles some special keys like VK_PRIOR and VK_NEXT
    SHORT GetKeyProfile(LPSTR name, LPSTR defaultValue, LPSTR iniPath) {
    	// ... get a key from config
    }
     
    // stores the keys configuration
    pTrinkletKeyCodes Trinklet_SetupKeys(void) {
    	// ... loads keys configuration
    }
     
    //////////////////////////////////////////////////////////////////
    // DLL ENTRY POINT
    //////////////////////////////////////////////////////////////////
     
    BOOL APIENTRY DllMain(HINSTANCE hinstDLL,
    					  DWORD fdwReason,
    					  LPVOID lpvReserved) {
    	g_hInstance = hinstDLL;
    	return TRUE;
    }
    [/code]
    Romain Guy
    Android - Mon livre - Mon blog

Discussions similaires

  1. Message système - Evénement clavier
    Par TOTO32 dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2007, 17h15
  2. Evènement lié au clavier dans une zone de texte
    Par navis84 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/03/2006, 09h12
  3. [Avancé] Recopie une session dans un autre client
    Par gregoun dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 29/06/2004, 12h11
  4. [BPW]Raccourcis clavier dans une fenêtre enfant
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 18/02/2004, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo