Toon posts:

[C++] System globale 'hook' - idlen van programma

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zou graag weten hoe ik het aantal seconden dat een persoon idle is moet monitorren.

Ik heb even op het forum reeds gezocht & deze URL is goed, maar niet goed genoeg:
http://www.codeproject.com/dll/trackuseridle.asp . Deze verwees me door naar http://www.codeproject.com/dll/hooks.asp . Daarvan heb ik de code gepakt en een beetje aangepast.

Nu het probleem is, als ik die code run van op de site, werkt alles mooi.
Pak ik mijn code, dan trigger hij enkel maar in mijn lokaal programma (dus als mijn muis over mijn eigen programma gaat), maar niet als ik mijn muis beweeg over mijn scherm.

Ik heb het al 3x nagekeken, maar ik kan niet zien waarom, daar ik toch alles +- hetzelfde doe:
Mijn h:
code:
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
#ifndef __MOUSEHOOK_H
#define __MOUSEHOOK_H

#if _MSC_VER > 1000
  #pragma once
#endif

#ifdef __cplusplus
  extern "C" {
#endif // __cplusplus

#ifdef MOUSEHOOK_EXPORTS
  #define LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 __declspec(dllexport)
#else // !MOUSEHOOK_EXPORTS
  #define LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 __declspec(dllimport)
  #pragma comment( lib, "MouseHook.lib" )
#endif // MOUSEHOOK_EXPORTS

LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 BOOL  setMyHook    ( );
LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 BOOL  clearMyHook  ( );
LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 DWORD getLatestTick( );

#define HOOK_MESSAGE__44E531B1_14D3_11d5_A025_006067718D05 _T("UWM_MOUSEMOVE_MSG-44E531B1_14D3_11d5_A025_006067718D05")

#ifdef __cplusplus
  }
#endif // __cplusplus

#endif // __MOUSEHOOK_H


Mijn cpp:
code:
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
// MouseHook.cpp : Defines the entry point for the DLL application.
//

#if _MSC_VER > 1000
  #pragma once
#endif // _MSC_VER > 1000

// Insert your headers here
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <windows.h>
#include <tchar.h>
#include "MouseHook.h"

HINSTANCE hInst;
UINT      UWM_MOUSEMOVE;
HHOOK     hook;
DWORD     m_dLastTickCount;

static LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam);

BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD  Reason, LPVOID Reserved )
{
  switch(Reason)
  { /* reason */
  case DLL_PROCESS_ATTACH:
    hInst             = hInstance;
    UWM_MOUSEMOVE     = RegisterWindowMessage(HOOK_MESSAGE__44E531B1_14D3_11d5_A025_006067718D05);
    hook              = NULL;
    m_dLastTickCount  = 0;
    return TRUE;

  case DLL_PROCESS_DETACH:
    clearMyHook( );
    return TRUE;
  } /* reason */

  return TRUE;
}


/****************************************************************************
*                                 setMyHook
* Result: BOOL
*         TRUE if successful
*         FALSE if error
* Effect: 
*         Sets the hook
****************************************************************************/

LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 BOOL setMyHook( )
{
  if ( hook != NULL )
    return FALSE;

  hook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)msghook, hInst, 0);

  return hook != NULL;
} // setMyHook

/****************************************************************************
*                                 clearMyHook
* Result: BOOL
*         TRUE  if successful
*         FALSE if error
* Effect: 
*         Removes the hook that has been set
****************************************************************************/

LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 BOOL clearMyHook( )
{
  if ( hook == NULL )
    return FALSE;

  BOOL unhooked = UnhookWindowsHookEx(hook);

  if ( unhooked )
    hook = NULL;

  return unhooked;
} // clearMyHook

/****************************************************************************
*                                 getLatestTick
* Result: DWORD
*         Latest GetTickCount from where there was an action.
****************************************************************************/
LIBSPEC__44E531B1_14D3_11d5_A025_006067718D05 DWORD getLatestTick( )
{
  return m_dLastTickCount;
}

/****************************************************************************
*                                   msghook
* Inputs:
*         int nCode: Code value
*         WPARAM wParam:
*         LPARAM lParam:
* Result: LRESULT
*         Either 0 or the result of CallNextHookEx
* Effect: 
*         Hook processing function.
****************************************************************************/
static LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode < 0)
  {
    CallNextHookEx(hook, nCode, wParam, lParam);
    return 0;
  }

  LPMSG msg = (LPMSG)lParam;

  switch( msg->message )
  {
  case WM_MOUSEMOVE:
  case WM_NCMOUSEMOVE:
    m_dLastTickCount = ::GetTickCount();
    // Do something with it...
    break;
  }

  return CallNextHookEx(hook, nCode, wParam, lParam);
} // msghook


Zou er mij misschien iemand kunnen wijzen op een fout die ik daar in gemaakt heb? Daar ik dit toch echt niet zie :(

[ Voor 194% gewijzigd door Creepy op 18-05-2005 17:52 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Zou er mij misschien iemand kunnen wijzen op een fout die ik daar in gemaakt heb? Daar ik dit toch echt nit zie :(
Je weet ondertussen nu wel dat dat zo eigenlijk niet werkt hier he ;)

Anyway: waarom roep je setMyHook nergens aan? Of die je dat vanuit je applicatie?

Wat heb je met een debugger al geprobeerd? Triggert je hook uberhaupt niet (wat logisch is als je setMyHook niet aanroept) of triggert je hook opzich wel maar krijg je niet de juiste MSG's door?

offtopic:
Grrr.. waarom zitten die quote en edit knopjes zo dicht bij elkaar....

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Creepy: inderdaad ;-)... Maar ik als ik het echt niet zie, dan roep ik hulp in van de pro's hé.

Dit is de DLL, want anders kan je geen globale systemhook maken. Dus die wordt aangeroepen in mijn applicatie.

In een debugger geeft ie totaal geen reactie op in de msgHook-functie in mijn versie, in de versie van codeproject werkt dit perfect. Bij mij enkel als ik mijn muis beweeg over mijn applicatie.

De hook die hookt percies enkel in mijn eigen thread/proces-ruimte. Maar ik kan echt niet begrijpen waarom in de versie van codeproject die WEL een globale hook is.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Dan wordt waarschijnlijk je hook niet goed geregistreerd. Waarom gebruik je eigenlijk WH_GETMESSAGE? Als je mouse movement wilt monitoren kan je toch ook WH_MOUSE gebruiken, evenals WH_KEYBOARD voor het toetsenbord?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Inderdaad,
Dat is ook wat ik eerst geprobeerd had, maar dat werkte ook niet...

Als je even gaat zien op de 2e link die ik gegeven heb, daar zal je zien dat dit perfect werkt in dat programmaatje, maar niet in het mijne :S.

Wat wel raar is dat de hooks wel goed geregistreerd worden (ik krijg een HHOOK waarde terug die != NULL). Maar het is percies dat deze geregistreerd worden in mijn huidige thread, en niet in het globale systeem, wat eigenlijk de bedoeling is.

BTW, als ik zeg "globaal systeem", geldt dit dan ook voor "fast switched users" in WinXP?

  • The End
  • Registratie: Maart 2000
  • Laatst online: 16:41

The End

!Beginning

Ik geloof dat je je HHOOK zo moet definieren in de DLL:

code:
1
2
3
4
5
#pragma data_seg("EenNaam")

HHOOK     hook;

#pragma data_seg( )


Volgens mij staat dat ook duidelijk bij de 2e link die je gaf :)

Edit: Globaal betekent voor de huidige desktop.

[ Voor 14% gewijzigd door The End op 19-05-2005 11:27 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
The End schreef op donderdag 19 mei 2005 @ 11:26:
Ik geloof dat je je HHOOK zo moet definieren in de DLL:

code:
1
2
3
#pragma data_seg("EenNaam")
HHOOK     hook;
#pragma data_seg( )


Volgens mij staat dat ook duidelijk bij de 2e link die je gaf :)

Edit: Globaal betekent voor de huidige desktop.
Goed dat je dat is opgevallen zeg. Ikzelf gebruik het volgende bij m'n hook.
C++:
1
2
3
4
5
6
#pragma bss_seg(".shared")
HWND        g_hwnd;
HHOOK       g_hhook;
#pragma bss_seg()

#pragma comment(linker, "/section:.shared,rws")


de g_hwnd is de handle van m'n eigen programma, zodat ik daar messages aan door kan geven (wordt geïnitaliseerd bij het setten van de hook). De g_hhook is voor CallNextHookEx e.d. Ik heb ze geplaatst in bss_seg(".shared") zodat alle instanties van de DLL erbij kunnen (shared memory). De "bss_seg" heeft hierbij als voordeel dat de variabelen niet geïnitialiseerd hoeven worden.

[ Voor 20% gewijzigd door riezebosch op 19-05-2005 13:31 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1