salve a tutti avrei un piccolo quesito da porre, è possibile rintracciare tramite un hook globale i vari cambiamenti di cursore che avvengono al di fuori del form da me creato? Grazie anticipatamente, spero di esser nella sezione giusta
salve a tutti avrei un piccolo quesito da porre, è possibile rintracciare tramite un hook globale i vari cambiamenti di cursore che avvengono al di fuori del form da me creato? Grazie anticipatamente, spero di esser nella sezione giusta
nessuno sa darmi una risposta????
In Java puro non è possibile, forse puoi scriverti l'hook in C e richiamarlo in Java con JNI...
SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
Di questo libro e degli altri (blog personale di recensioni libri) | NO M.P. TECNICI
inanzitutto grazie per la risposta, credo di aver formulato male la domanda. Io ho gia creato un hook del mouse, mi chiedevo se esiste il modo di intercettare oltre alle coordinate x ed y e oltre a quale finistra sia sopra il cursore anche il tipo di forma di cursore
allora mi spiego meglio io ho scritto queste due classie questacodice:package MouseHook; import static com.jinvoke.win32.WinConstants.*; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import com.jinvoke.Callback; import com.jinvoke.JInvoke; import com.jinvoke.NativeImport; import com.jinvoke.Util; import com.jinvoke.win32.Kernel32; import com.jinvoke.win32.User32; import com.jinvoke.win32.structs.Msg; public class MouseHook extends JPanel{ static { JInvoke.initialize(); } @NativeImport(library = "user32") public native static int SetWindowsHookEx (int idHook, Callback hookProc, int hModule, int dwThreadId); @NativeImport(library = "user32") public native static int UnhookWindowsHookEx (int idHook); public static final int WH_MOUSE_LL = 14; static JFrame frame; static TextArea AreaEventiMouse = new TextArea(); static JButton setHookBtn; static JButton removeHookBtn; public MouseHook() { super(new BorderLayout()); AreaEventiMouse.setText("1) Clicca su \"Set Mouse Hook\" bottone.\n" + "2) inizia a cliccare sul desktop. Gli eventi vengono qui catturati.\n" + "3) ferma l'hook cliccando su \"Remove Mouse Hook\" bottone.\n\n"); JScrollPane MouseEventPane = new JScrollPane(AreaEventiMouse); add(MouseEventPane, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); setHookBtn = new JButton("Set Mouse Hook"); setHookBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { setMouseHook(); }} ); removeHookBtn = new JButton("Remove Mouse Hook"); removeHookBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { unsetMouseHook(); }} ); removeHookBtn.setEnabled(false); buttonPanel.add(setHookBtn); buttonPanel.add(removeHookBtn); add(buttonPanel, BorderLayout.SOUTH); } private void setMouseHook() { setHookBtn.setEnabled(false); removeHookBtn.setEnabled(true); // This hook is called in the context of the thread that installed it. // The call is made by sending a message to the thread that installed the hook. // Therefore, the thread that installed the hook must have a message loop. // // We crate a new thread as we don't want the AWT Event thread to be stuck running a message pump // nor do we want the main thread to be stuck in running a message pump Thread hookThread = new Thread(new Runnable(){ public void run() { if (MouseProc.hookHandle == 0) { int hInstance = Kernel32.GetModuleHandle(null); MouseProc.hookHandle = SetWindowsHookEx(WH_MOUSE_LL, new Callback(MouseProc.class, "lowLevelMouseProc"), hInstance, 0); // Standard message dispatch loop (message pump) Msg msg = new Msg(); while (User32.GetMessage(msg, 0, 0, 0)) { User32.TranslateMessage(msg); User32.DispatchMessage(msg); } } else { AreaEventiMouse.append("Hook già installato.\n"); } }}); hookThread.start(); } private void unsetMouseHook() { setHookBtn.setEnabled(true); removeHookBtn.setEnabled(false); UnhookWindowsHookEx(MouseProc.hookHandle); MouseProc.hookHandle = 0; } private static void createAndShowGUI() { //Create and set up the window. frame = new JFrame("Mouse Hook"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MouseHook MouseEventsWindow = new MouseHook(); MouseEventsWindow.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); //Add content to the window. frame.add(MouseEventsWindow, BorderLayout.CENTER); //Display the window. frame.pack(); frame.setBounds(300, 200, 750, 600); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } class MouseProc { static int hookHandle; @NativeImport(library = "user32") public native static int CallNextHookEx (int idHook, int nCode, int wParam, int lParam); static { JInvoke.initialize(); } public static int lowLevelMouseProc(int nCode, int wParam, int lParam ) { if (nCode < 0) return CallNextHookEx(hookHandle, nCode, wParam, lParam); if (nCode == HC_ACTION) { MSLLHOOKSTRUCT mInfo = Util.ptrToStruct(lParam, MSLLHOOKSTRUCT.class); String message = "Mouse pt: (" + mInfo.pt.x + ", " + mInfo.pt.y + ") "; switch (wParam) { case WM_LBUTTONDOWN: message += "Bottone sinistro giù"; break; case WM_LBUTTONUP: message += "Bottone sisnistro sù"; break; case WM_MOUSEMOVE: message += "Mouse mosso"; break; case WM_MOUSEWHEEL: message += "rotellina mouse girata"; break; case WM_RBUTTONDOWN: message += "Bottone destro giu"; break; case WM_RBUTTONUP: message += "Bottone sinistro giu"; break; } System.out.println(message); MouseHook.AreaEventiMouse.append(message+"\n"); } return CallNextHookEx(hookHandle, nCode, wParam, lParam); } }e fino a qui ci siamo, il programma funziona bene dandomi cio che gli chiedo di darmi.codice:package MouseHook; import com.jinvoke.NativeStruct; import com.jinvoke.win32.structs.Point; @NativeStruct public class MSLLHOOKSTRUCT { public Point pt = new Point(); public int mouseData; public int flags; public int time; public int dwExtraInfo; }
la mia domanda è come posso modificare questo codice per poter far in modo che oltre ai dati che mi invia mi riesca anche a intercettare i vari cambiamenti di cursore?
codice:package MouseHook; import static com.jinvoke.win32.WinConstants.*; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import com.jinvoke.Callback; import com.jinvoke.JInvoke; import com.jinvoke.NativeImport; import com.jinvoke.Util; import com.jinvoke.win32.Kernel32; import com.jinvoke.win32.User32; import com.jinvoke.win32.structs.Msg; public class MouseHook extends JPanel{ static { JInvoke.initialize(); } @NativeImport(library = "user32") public native static int SetWindowsHookEx (int idHook, Callback hookProc, int hModule, int dwThreadId); @NativeImport(library = "user32") public native static int UnhookWindowsHookEx (int idHook); public static final int WH_MOUSE_LL = 14; static JFrame frame; static TextArea AreaEventiMouse = new TextArea(); static JButton setHookBtn; static JButton removeHookBtn; public MouseHook() { super(new BorderLayout()); AreaEventiMouse.setText("1) Clicca su \"Set Mouse Hook\" bottone.\n" + "2) inizia a cliccare sul desktop. Gli eventi vengono qui catturati.\n" + "3) ferma l'hook cliccando su \"Remove Mouse Hook\" bottone.\n\n"); JScrollPane MouseEventPane = new JScrollPane(AreaEventiMouse); add(MouseEventPane, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); setHookBtn = new JButton("Set Mouse Hook"); setHookBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { setMouseHook(); }} ); removeHookBtn = new JButton("Remove Mouse Hook"); removeHookBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { unsetMouseHook(); }} ); removeHookBtn.setEnabled(false); buttonPanel.add(setHookBtn); buttonPanel.add(removeHookBtn); add(buttonPanel, BorderLayout.SOUTH); } private void setMouseHook() { setHookBtn.setEnabled(false); removeHookBtn.setEnabled(true); // This hook is called in the context of the thread that installed it. // The call is made by sending a message to the thread that installed the hook. // Therefore, the thread that installed the hook must have a message loop. // // We crate a new thread as we don't want the AWT Event thread to be stuck running a message pump // nor do we want the main thread to be stuck in running a message pump Thread hookThread = new Thread(new Runnable(){ public void run() { if (MouseProc.hookHandle == 0) { int hInstance = Kernel32.GetModuleHandle(null); MouseProc.hookHandle = SetWindowsHookEx(WH_MOUSE_LL, new Callback(MouseProc.class, "lowLevelMouseProc"), hInstance, 0); // Standard message dispatch loop (message pump) Msg msg = new Msg(); while (User32.GetMessage(msg, 0, 0, 0)) { User32.TranslateMessage(msg); User32.DispatchMessage(msg); } } else { AreaEventiMouse.append("Hook già installato.\n"); } }}); hookThread.start(); } private void unsetMouseHook() { setHookBtn.setEnabled(true); removeHookBtn.setEnabled(false); UnhookWindowsHookEx(MouseProc.hookHandle); MouseProc.hookHandle = 0; } private static void createAndShowGUI() { //Create and set up the window. frame = new JFrame("Mouse Hook"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MouseHook MouseEventsWindow = new MouseHook(); MouseEventsWindow.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); //Add content to the window. frame.add(MouseEventsWindow, BorderLayout.CENTER); //Display the window. frame.pack(); frame.setBounds(300, 200, 750, 600); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } class MouseProc { static int hookHandle; @NativeImport(library = "user32") public native static int CallNextHookEx (int idHook, int nCode, int wParam, int lParam); static { JInvoke.initialize(); } public static int lowLevelMouseProc(int nCode, int wParam, int lParam ) { if (nCode < 0) return CallNextHookEx(hookHandle, nCode, wParam, lParam); if (nCode == HC_ACTION) { MSLLHOOKSTRUCT mInfo = Util.ptrToStruct(lParam, MSLLHOOKSTRUCT.class); String message = "Mouse pt: (" + mInfo.pt.x + ", " + mInfo.pt.y + ") "; switch (wParam) { case WM_LBUTTONDOWN: message += "Bottone sinistro giù"; break; case WM_LBUTTONUP: message += "Bottone sisnistro sù"; break; case WM_MOUSEMOVE: message += "Mouse mosso"; break; case WM_MOUSEWHEEL: message += "rotellina mouse girata"; break; case WM_RBUTTONDOWN: message += "Bottone destro giu"; break; case WM_RBUTTONUP: message += "Bottone sinistro giu"; break; } System.out.println(message); MouseHook.AreaEventiMouse.append(message+"\n"); } return CallNextHookEx(hookHandle, nCode, wParam, lParam); } }
codice:package MouseHook; import com.jinvoke.NativeStruct; import com.jinvoke.win32.structs.Point; @NativeStruct public class MSLLHOOKSTRUCT { public Point pt = new Point(); public int mouseData; public int flags; public int time; public int dwExtraInfo; }
scusate ma me lo aveva messo su una riga
spero di esser stato un po piu chiaro e chemi possiate rispondere
L'uso dei tag CODE è semplice: apri il tag CODE, scrivendo [CODE], poi incolli tutto il codice, indentato, quindi alla fine di tutto il codice scrivi [/CODE].Originariamente inviato da SimoneIlLimone
scusate ma me lo aveva messo su una riga
Il pulsante "CODE" serve per scrivere una sola riga di codice e, generalmente, non va usato per altro.
Cerco di sistemare io il tuo codice.
Ciao.![]()
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza