자바 마우스 갈고리 활용

18683 단어 【JavaApplication】
작년 겨울방학 에 집에 돌아 와 아무 일 없 이 집에 서 코드 를 두 드 렸 다.주로 자바 언어 로 작은 활용: 확대경, 화면 캡 처
간단 한 그림 그리 기 도구, 채색기 같은 것 은 마지막 에 작은 소프트웨어 로 통합 된다.그러나 이 과정 에서 자바 에서 화면 이 실 현 된 것 을 발견 했다.
캡 처, 색상 을 채취 할 때 마우스 의 조작 이 부족 해 보 입 니 다. 위의 기능 은 보통 전체 화면 을 미리 얻 은 다음 에 하 는 것 입 니 다.
이 그림 에서 조작 합 니 다.이것 은 인터페이스 소프트웨어 가 반드시 활성화 상태 에 있어 야 하기 때문에 매우 불편 하 다.
      사실 위의 그런 조작 으로 기능 을 실현 하 는 것 도 그다지 나 쁘 지 는 않 지만 흥미 가 있 기 때문에 자바 가 몇 번 째 를 빌 리 는 지 보고 싶 습 니 다.
3 자 jar 는 windows 바 텀 과 의 상호작용 을 실현 할 수 있 습 니까?그래서 인터넷 에서 찾 아 보 니 다음 과 같다.
      검색 을 통 해 '마우스 갈고리' 를 통 해 이 루어 질 수 있 는 것 이 무엇 인지 알 게 되 었 습 니 다. 다음은 '갈고리' 입 니 다.
             (Hook), Windows           ,                   
            ,                   。      ,          
          。              window       。              
        ,      ,      。         ,                 ,     
             ,            。             (  )   ,   
                   ,            。
             Hook API  Windows           ,                   ,
                      API       ,Hook API              
            API       ,              API     。
                 1)                      。 
              (2)                      。 
              (3)           Shell    。           。 
              (4)                          。 
              (5)                           
                   ,       java       ?
                  jna    
                 JNA(Java Native Access )    Java                  (native library: Window dll)        Native/JNI  。         java       native library      ,JNA     Java   native function   。
                    ,     ,         ,              .
             MouseLLHook.java
package com.kiritor;  import java.awt.AWTException; import java.awt.Color; import java.awt.Cursor; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Robot;  import com.sun.jna.Pointer; import com.sun.jna.platform.win32.*; import com.sun.jna.platform.win32.WinUser.*; import com.sun.jna.platform.win32.WinDef.HMODULE; import com.sun.jna.platform.win32.WinDef.LRESULT; import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinUser.HHOOK; import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;  public class MouseLLHook {  	 	private boolean flag; 	public ColorFrame getColorFrame() { 		return colorFrame; 	}   	public void setColorFrame(ColorFrame colorFrame) { 		this.colorFrame = colorFrame; 	}  	private static ColorFrame colorFrame = null; 	//                  	public static Point mousepoint; 	public static MouseInfo mouseInfo = null; 	static Color pixel = new Color(0, 0, 0); 	static Integer R = 0, G = 0, B = 0; 	static Integer X = 0, Y = 0; 	public static final int WM_LBUTTONUP = 514; 	public static final int WM_LBUTTONDOWN = 513; 	public static final int WM_RBUTTONUP = 517; 	public static final int WM_RBUTTONDOWN = 516; 	public static final int WM_MOUSEHWHEEL = 526; 	public static final int WM_MOUSEWHEEL = 522; 	public static final int WM_MOUSEMOVE = 512;  	static HHOOK mouseHHK, keyboardHHK;//   、        	static LowLevelMouseProc mouseHook;//        	static LowLevelKeyboardProc keyboardHook;//            public MouseLLHook(ColorFrame colorFrame)     { 	   this.colorFrame=colorFrame;     } 	 	 	//      	static void setHook() { 		HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); 		mouseHHK = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE_LL, 				mouseHook, hMod, 0); 		mouseHHK.nativeType(); 		keyboardHHK = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, 				keyboardHook, hMod, 0); 	}  	//      	static void unhook() { 		User32.INSTANCE.UnhookWindowsHookEx(keyboardHHK); 		User32.INSTANCE.UnhookWindowsHookEx(mouseHHK); 	}  	public  void getColor(String[] args) {  		keyboardHook = new LowLevelKeyboardProc() {  			@Override 			//           :http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx 			public LRESULT callback(int nCode, WPARAM wParam, 					KBDLLHOOKSTRUCT lParam) { 				int w = wParam.intValue(); 				//   alt  w=.WM_SYSKEYDOWN;          w=WinUser.WM_KEYDOWN 				if (w == WinUser.WM_KEYDOWN || w == WinUser.WM_SYSKEYDOWN) 					System.out.println("key down: vkCode = " + lParam.vkCode); 				else if (w == WinUser.WM_KEYUP || w == WinUser.WM_SYSKEYUP) 					System.out.println("key up: vkCode = " + lParam.vkCode);  				//     'q'    ,'q' vkCode 81 				if (lParam.vkCode == 81) { 					unhook(); 					System.err.println("program terminated."); 					System.exit(0); 				} 				return User32.INSTANCE.CallNextHookEx(keyboardHHK, nCode, 						wParam, lParam.getPointer()); 			} 		};  		mouseHook = new LowLevelMouseProc() {  			@Override 			//           :http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986(v=vs.85).aspx 			public LRESULT callback(int nCode, WPARAM wParam, 					MOUSEHOOKSTRUCT lParam) { 				switch (wParam.intValue()) { 				case WM_MOUSEMOVE: 					//System.out.print("mouse moved:"); 					break; 				case WM_LBUTTONDOWN: { 					try { 						 						Robot robot = new Robot(); 						mousepoint = mouseInfo.getPointerInfo().getLocation(); 						// System.out.println(mousepoint); 						pixel = robot.getPixelColor(mousepoint.x, mousepoint.y); 						X = mousepoint.x; 						Y = mousepoint.y; 						R = pixel.getRed(); 						G = pixel.getGreen(); 						B = pixel.getBlue(); 				 						String s16 = "#" + Integer.toHexString(R) 								+ Integer.toHexString(G) 								+ Integer.toHexString(B);//            。 					 						Color col = new Color(R, G, B); 						 						if(colorFrame.isFlag()==false) 						{ 							colorFrame.getRedText().setText(R.toString()); 							colorFrame.getGreenText().setText(G.toString()); 							colorFrame.getBlueText().setText(B.toString()); 							colorFrame.getColor16Text().setText(s16); 							colorFrame.getNewColor().setBackground(col); 						    colorFrame.setFlag(true); 						} 						 						colorFrame.setVisible(true); 					} catch (AWTException ex) { 						ex.printStackTrace(); 					} 				} 					break; 				case WM_LBUTTONUP: 					//System.out.print("mouse left button up"); 					break; 				case WM_RBUTTONUP: 					//System.out.print("mouse right button up:"); 					break; 				case WM_RBUTTONDOWN: 					//System.out.print("mouse right button down:"); 					break; 				case WM_MOUSEWHEEL: 					//System.out.print("mouse wheel rotated:"); 					break; 				} 				//System.out.println("(" + lParam.pt.x + "," + lParam.pt.y + ")"); 				return User32.INSTANCE.CallNextHookEx(mouseHHK, nCode, wParam, 						lParam.getPointer()); 			} 		};  		setHook();  		int result; 		MSG msg = new MSG(); 		//      		//    while        ,               GetMessage      ,        。 		while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) { 			if (result == -1) { 				System.err.println("error in GetMessage"); 				unhook(); 				break; 			} else { 				User32.INSTANCE.TranslateMessage(msg); 				User32.INSTANCE.DispatchMessage(msg); 			} 		} 		unhook(); 	}  }
package com.kiritor; import com.sun.jna.Structure; import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.LRESULT; import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinUser.HOOKPROC; import com.sun.jna.platform.win32.WinUser.POINT;  interface LowLevelMouseProc extends HOOKPROC {     LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam); }  public class MOUSEHOOKSTRUCT extends Structure {     public class ByReference extends MOUSEHOOKSTRUCT implements             Structure.ByReference {     };      public POINT pt;     public HWND hwnd;     public int wHitTestCode;     public ULONG_PTR dwExtraInfo; }  
ColorFrame.java
4. 567913. 일부 이미지 파일 을 잃 어 버 려 서 인터페이스 효과 도 는 붙 이지 않 습 니 다!이 프로그램 에 사용 할 jar 패키지
package com.kiritor;  import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.Menu; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.Rectangle; import java.awt.Robot; import java.awt.SystemTray; import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter;  import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JWindow;  public class ColorFrame extends JWindow { 	 	private boolean flag= false; 	public boolean isFlag() { 		return flag; 	}  	public void setFlag(boolean flag) { 		this.flag = flag; 	}  	private JLabel color16 = null; 	private JLabel color16Text = null; 	private JLabel red = null; 	private JLabel redText = null; 	private JLabel green = null; 	private JLabel greenText = null; 	private JLabel blue = null; 	private JLabel blueText = null; 	private JPanel newColor = null; 	private JLabel newLabel = null; 	private int xx; 	private int yy; 	private boolean isDraging; 	private TrayIcon trayIcon; 	private JPanel bgJPanel = null; 	private ImageIcon bg = new ImageIcon(getClass().getClassLoader() 			.getResource("images/bg.png"));  	/** 	 *        	 */ 	//           	private JLabel jiantieban = null; 	private ImageIcon jiantiebanIcon = new ImageIcon(getClass() 			.getClassLoader().getResource("images/jiantieban.png"));  	private ImageIcon jiantiebanIcon_entered = new ImageIcon(getClass() 			.getClassLoader().getResource("images/jiantieban_entered.png")); 	//          	private JLabel getAgain = null; 	private ImageIcon getAgainIcon = new ImageIcon(getClass().getClassLoader() 			.getResource("images/getagain.png")); 	private ImageIcon getAgainIcon_entered = new ImageIcon(getClass() 			.getClassLoader().getResource("images/getagain_entered.png"));  	//          	private JLabel cancel = null;  	private ImageIcon cancelIcon = new ImageIcon(getClass().getClassLoader() 			.getResource("images/cancel.png")); 	private ImageIcon cancel_entered = new ImageIcon(getClass() 			.getClassLoader().getResource("images/cancel_entered.png"));  	public ColorFrame(){} 	 	public ColorFrame(int x,int y) { 		setLocation(x, y); 	}  	public void showUI() { 		init();  		setSize(150, 150); 		setLayout(null); 		setAlwaysOnTop(true); 		addMouseListener(new MouseAdapter() { 			public void mousePressed(MouseEvent e) { 				requestFocus(); 				isDraging = true; 				xx = e.getX(); 				yy = e.getY(); 			}  			public void mouseReleased(MouseEvent e) { 				isDraging = false; 			} 			 			@Override 			public void mouseEntered(MouseEvent e) { 				// TODO Auto-generated method stub 				setFlag(true);//              			} 		}); 		addMouseMotionListener(new MouseMotionAdapter() { 			public void mouseDragged(MouseEvent e) { 				if (isDraging) { 					int left = getLocation().x; 					int top = getLocation().y; 					setLocation(left + e.getX() - xx, top + e.getY() - yy); 				} 			} 		});  		setVisible(true); 		// 		// TestEvent t = new TestEvent(this); 		// t.setLayout(null); 		// t.add(bgJPanel); 		// this.getContentPane().add( t); 		add(bgJPanel); 		//setLocationRelativeTo(null);  	}  	public void init() {  		bgJPanel = new JPanel() { 			public void paintComponent(Graphics g) { 				super.paintComponent(g); 				g.drawImage(bg.getImage(), 0, 0, null); 				this.setOpaque(false); 			} 		}; 		bgJPanel.setOpaque(false); 		bgJPanel.setLayout(null); 		bgJPanel.setBounds(0, 0, 150, 150);  		newColor = new JPanel(); 		newLabel = new JLabel("  "); 		newLabel.setFont(new Font("    ", 0, 12)); 		newLabel.setBounds(30, 10, 30, 20); 		newColor.setBounds(20, 35, 50, 50); 		newColor.setBackground(Color.gray);  		red = new JLabel("Red:"); 		red.setFont(new Font("    ", 0, 12)); 		red.setBounds(80, 35, 30, 10);  		redText = new JLabel("sdf"); 		redText.setFont(new Font("    ", 0, 12)); 		redText.setBounds(115, 35, 30, 10); 		green = new JLabel("Green:"); 		green.setFont(new Font("    ", 0, 12)); 		green.setBounds(80, 53, 40, 10); 		greenText = new JLabel("sdf"); 		greenText.setFont(new Font("    ", 0, 12)); 		greenText.setBounds(115, 53, 30, 10); 		blue = new JLabel("Blue:"); 		blue.setFont(new Font("    ", 0, 12)); 		blue.setBounds(80, 71, 30, 10); 		blueText = new JLabel("sdf"); 		blueText.setFont(new Font("    ", 0, 12)); 		blueText.setBounds(115, 71, 30, 10);  		color16 = new JLabel("    :"); 		color16.setBounds(20, 95, 45, 10); 		color16.setFont(new Font("    ", 0, 10)); 		color16Text = new JLabel("#aaaa"); 		color16Text.setBounds(70, 95, 60, 10); 		color16Text.setFont(new Font("    ", 0, 12)); 		color16Text.setForeground(Color.red);  		/**             */         //      		jiantieban = new JLabel(jiantiebanIcon_entered); 		jiantieban.addMouseListener(new MouseAdapter() { 			@Override 			public void mouseClicked(MouseEvent e) { 				// TODO Auto-generated method stub 				 				setClipboard(color16Text.getText()); 			    			} 		 			@Override 			public void mouseEntered(MouseEvent e) { 				// TODO Auto-generated method stub 				jiantieban.setIcon(jiantiebanIcon); 				setFlag(true); 			} 		 			@Override 			public void mouseExited(MouseEvent e) { 				// TODO Auto-generated method stub 				jiantieban.setIcon(jiantiebanIcon_entered); 			   			} 		}); 		jiantieban.setBounds(10, 115, 40, 20);  		//       		getAgain = new JLabel(getAgainIcon_entered); 		getAgain.addMouseListener(new MouseAdapter() { 			@Override 			public void mouseClicked(MouseEvent e) { 				// TODO Auto-generated method stub 				setFlag(false);  	            setVisible(false); 			}  			@Override 			public void mouseEntered(MouseEvent e) { 				// TODO Auto-generated method stub 				getAgain.setIcon(getAgainIcon); 				 			}  			@Override 			public void mouseExited(MouseEvent e) { 				// TODO Auto-generated method stub 				getAgain.setIcon(getAgainIcon_entered); 			} 		}); 		getAgain.setBounds(55, 115, 40, 20); 		 		//          		cancel = new JLabel(cancel_entered); 		cancel.addMouseListener(new MouseAdapter() { 			@Override 			public void mouseClicked(MouseEvent e) { 				setVisible(false); 			}  			@Override 			public void mouseEntered(MouseEvent e) { 				// TODO Auto-generated method stub 				cancel.setIcon(cancelIcon); 				 			}  			@Override 			public void mouseExited(MouseEvent e) { 				// TODO Auto-generated method stub 				cancel.setIcon(cancel_entered); 			} 		}); 		cancel.setBounds(100, 115, 40, 20); 		 		 		bgJPanel.add(newLabel); 		bgJPanel.add(newColor); 		bgJPanel.add(red); 		bgJPanel.add(redText); 		bgJPanel.add(green); 		bgJPanel.add(greenText); 		bgJPanel.add(blue); 		bgJPanel.add(blueText); 		bgJPanel.add(color16); 		bgJPanel.add(color16Text); 		bgJPanel.add(jiantieban); 		bgJPanel.add(getAgain); 		bgJPanel.add(cancel); 		 	}  	public JPanel getNewColor() { 		return newColor; 	}  	public void setNewColor(JPanel newColor) { 		this.newColor = newColor; 	}  	public JLabel getColor16Text() { 		return color16Text; 	}  	public void setColor16Text(JLabel color16Text) { 		this.color16Text = color16Text; 	}  	public JLabel getRedText() { 		return redText; 	}  	public void setRedText(JLabel redText) { 		this.redText = redText; 	}  	public JLabel getGreenText() { 		return greenText; 	}  	public void setGreenText(JLabel greenText) { 		this.greenText = greenText; 	}  	public JLabel getBlueText() { 		return blueText; 	}  	public void setBlueText(JLabel blueText) { 		this.blueText = blueText; 	}  	public  void getColor(String[] args) { 		 		 		new MouseLLHook(this).getColor(null); 	} 	public static void main(String[] args) { 		ColorFrame colorFrame = new ColorFrame(); 		colorFrame.showUI(); 		MouseLLHook hook = new MouseLLHook(colorFrame); 		hook.getColor(null); 	} 	/*        */ 	public  void setClipboard(String str)  	{     	StringSelection ss = new StringSelection(str);     	Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);     }  } 
               http://download.csdn.net/detail/kiritor/5115277

좋은 웹페이지 즐겨찾기