|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Registrazione click del mouse avvenuti sul desktop
Ciao a tutti,
ho un piccolo problema. Mi è stato richiesto di valutare la possibilità di monitorare (scrivere un file di log) i click del mouse avvenuti su delle porzioni del desktop (sistema operativo windows). Una specie di mouse logger. Es: Ho una sbarra delle applicazioni nella parte alta del desktop da monitorare e in base a dove avvine in click in questa sbarra scriverlo in un file. La mia idea sarebbe quella di creare un windows service. Questo programma deve funzionare sempre e deve avviarsi in automatico all'avvio di windows. In poche parole deve essere totalmente trasparente all'utente. Secondo voi è possibile? Avete qualche idea o qualche consiglio da darmi. Qualsiasi linguaggi di programmazione va bene. Grazie a tutti. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Qui troverai abbastanza informazioni da mettere insieme qualcosa, posto che tu abbia qualche conoscenza (anche minima) di C#.
http://www.codeproject.com/KB/cs/globalhook.aspx Se vuoi filtrare i click puoi usare GetForegroundWindow per determinare qual'è la finestra che l'utente sta visualizzando in maniera tale da determinare a quale processo appartiene. Ultima modifica di !k-0t1c! : 13-05-2009 alle 14:37. |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer Dichiarazioni generali : Codice:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
Private Const vKeyPSinistro = 1 'Click Sinistro
Private mouseDownSn As Boolean = False
Private Const vKeyPDestro = 2 'Click Destro
Private mouseDownDx As Boolean = False
Private Const vKeyPCentrale = 4 'Click Centrale
Private mouseDownCn As Boolean = False
'Coordinate al momento del MouseDown
Private mouseDownX As Integer = 0
Private mouseDownY As Integer = 0
'Coordinate Mouse Timer
Private mouseX As Integer = 0
Private mouseY As Integer = 0
Codice:
mouseX = Cursor.Position.X
mouseY = Cursor.Position.Y
'Click Sinistro
If GetAsyncKeyState(vKeyPSinistro) And mouseDownSn = False Then
mouseDownSn = True
mouseDownX = mouseX
mouseDownY = mouseY
End If
If GetAsyncKeyState(vKeyPSinistro) = 0 Then
If mouseDownSn = True And mouseX = mouseDownX And mouseY = mouseDownY Then
'Click Sinistro accettato nel punto X,Y -> gestisco l'evento
ListBox1.Items.Add(Now & " - Click Sinistro in : X[" & mouseX & "]-Y[" & mouseY & "]")
End If
mouseDownSn = False
End If
'...
'...
In ogni caso, il Log registra Data/Ora/Coordinate Desktop X ed Y/Click-Sn-Dx-Centrale. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Occhio alla sbarra ci finisce chi lo usa e chi l'ha scritto.
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
@MarcoGG, la tua soluzione per quanto possa funzionare è altamente inefficiente e consuma risorse della CPU in quantità comparata con i global hooks, fatti apposta per il proposito di Federicoat ed almeno altrettanto semplici da usare.
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Grazie a tutti... purtroppo su vb c# o c++ non ho molta conoscenza.
Non devo fare questo programmino per svago ma per lavoro. Ovviamente mi serve qualcosa che non consumi troppe risorse e che non interferisca con gli altri processi. Qualcosa che catturi il click del mouse ovunque si trovi.... ho trovato questo codice per iniziare... qualcuno mi sa dare un feedback? http://blogs.msdn.com/toub/archive/2...03/589468.aspx Dimenticavo, una cosa è fondamentale... questo programma deve lavorare in background.. in poche parole deve essere un processo o qualcosa di simile... Ultima modifica di Federicoat : 13-05-2009 alle 17:40. |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Ragazzi ho bisogno di aiuto...
Ho provato a copiare e a compilare sta classe ma nulla da fare... non riesco a far partire nulla... vi prego aiutatemi... per lavorare con c# ho scaricato Microsoft visual c# express edition. Codice:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
class InterceptMouse
{
private static LowLevelMouseProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Main()
{
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
}
private static IntPtr SetHook(LowLevelMouseProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_MOUSE_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 &&
MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
{
MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
Console.WriteLine(hookStruct.pt.x + ", " + hookStruct.pt.y);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
private const int WH_MOUSE_LL = 14;
private enum MouseMessages
{
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONUP = 0x0202,
WM_MOUSEMOVE = 0x0200,
WM_MOUSEWHEEL = 0x020A,
WM_RBUTTONDOWN = 0x0204,
WM_RBUTTONUP = 0x0205
}
[StructLayout(LayoutKind.Sequential)]
private struct POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
private struct MSLLHOOKSTRUCT
{
public POINT pt;
public uint mouseData;
public uint flags;
public uint time;
public IntPtr dwExtraInfo;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelMouseProc 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);
}
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
PM per Federicoat
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Non so se hai letto bene l'articolo di cui ti avevo dato il link, ma in cima è disponibile il download di alcuni sorgenti, nello specifico: http://www.codeproject.com/KB/cs/glo...lhook2_src.zip
(richiede registrazione) Se scarichi quello avrai i sorgenti di una libreria chiamata Gma.UserActivityMonitor che - una volta aggiunta tra le dipendenze del tuo progetto in Visual C# - non richiede nient'altro che la definizione di un EventHandler per l'evento che vuoi gestire e poi l'aggiunta dell'evento in questo modo: Codice:
HookManager.MouseClick += TUO_EVENT_HANDLER; |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
@ Federicoat : ovviamente se preferisci studiare il metodo dei Global Hooks in C#, hai la mia benedizione. |
|
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Quote:
http://www.codeproject.com/KB/cs/globalhook.aspx (Mouse Hook version 1) E' perfetto per le mie esigenze, ma l'unico problema è che non vorrei che mi venisse mostrato il form... cioè, io ho solo bisogno di loggare in modo stealth senza mostrare il form dell'applicazione... c'è qualcuno che mi suggerisce come eliminare il form, senza smontare l'event handling che mi sembra perfetto... Poi mi gestisco da solo il logging su file, quello non è un problema |
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
La soluzione che gli hai proposto è comunque inaccettabile perché Federicoat ha specificato che gli serve qualcosa di leggero, e un loop che ogni volta fa diverse chiamate tramite P/Invoke è tutto meno che leggero. Nella programmazione non conta solo il risultato, contano molto anche i passaggi, e sembra che tu non sia disposto a recepire questo concetto; pertanto finché posterai soluzioni molto discutibili continuerò a criticarle come debito (vd. thread stringa/hex), astenendomi tuttavia da un dibattito che reputo sterile e limitandomi a mostrare a chi fa la domanda perché dovrebbe evitare l'uso della tua risposta. |
|
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
|
|
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Quote:
Per quanto riguarda la compilazione delle classi alla fine sono riuscito a farla correttamente. Quella che vi ho incollato prima non riuscivo a compilarla perchè sbagliavo a creare il progetto. Cmq la mia NON esperienza in c# deriva dal fatto che io nella vita faccio l'analista programmatore Oracle, ma, lavorando in una ditta piccola ogni tanto ti capita di dover fare qualcosa fuori dal tuo lavoro e che in università non hai fatto. |
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
My bad, mi sono dimenticato che Form non ha Visible.
Ad ogni modo puoi fare facilmente così: apri l'editor visuale, fai doppio click sullo sfondo del form, ti porterà ad una schermata di codice, all'interno dell'eventhandler per l'evento Load del form, inserisci come riga Codice:
Hide(); E sì, capisco che sta roba rispetto ad Oracle non abbia nulla a che vedere |
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 34
|
Quote:
mmmm non funziona... facendo duobleClick sulla form mi porta in questa portzione di codice: Codice:
void MainFormLoad(object sender, System.EventArgs e)
{
Hide();
actHook = new UserActivityHook(); // crate an instance with global hooks
// hang on events
actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}
Codice:
public static void Main(string[] args)
{
Application.Run(new MainForm());
}
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Il modo più breve per nascondere una Form è : -> ShowInTaskbar = false -> Opacity = 0 Proprietà che puoi già definire nella Form a designer. Il metodo static void Main in Program.cs lascialo stare così com'è. |
|
|
|
|
|
|
#19 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21881
|
sostituisci hide(); con this.hide();
e cmq occhio che quello che stai creando è illegale
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#20 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
Se proprio volessi eliminare il form potresti spostare la registrazione degli eventi Codice:
actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved); actHook.KeyDown+=new KeyEventHandler(MyKeyDown); actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress); actHook.KeyUp+=new KeyEventHandler(MyKeyUp); Codice:
while(true)
{
Application.DoEvents();
System.Threading.Thread.Sleep(250);
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:59.




















