`
yiqieanhao
  • 浏览: 67375 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

鼠标样式的相关问题

    博客分类:
  • JAVA
阅读更多
JAVA对于底层对象比如鼠标等还是得依靠JNI或是JNA来处理,这里记录下如何实现鼠标的获取、是否是默认鼠标样式判断等。

获取鼠标样式并显示:
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.sun.jna.Pointer;

public class LoadCursor {

	  public static void draw(BufferedImage image, int cursor,
	      int diFlags) {
	    int width = image.getWidth();
	    int height = image.getHeight();

	    User32 user32 = User32.INSTANCE;
	    Gdi32 gdi32 = Gdi32.INSTANCE;

	    Pointer hIcon = user32
	        .LoadCursorW(Pointer.NULL, cursor);
	    Pointer hdc = gdi32.CreateCompatibleDC(Pointer.NULL);
	    Pointer bitmap = gdi32.CreateCompatibleBitmap(hdc,
	        width, height);

	    gdi32.SelectObject(hdc, bitmap);
	    user32.DrawIconEx(hdc, 0, 0, hIcon, width, height, 0,
	        Pointer.NULL, diFlags);

	    for (int x = 0; x < width; x++) {
	      for (int y = 0; y < width; y++) {
	        int rgb = gdi32.GetPixel(hdc, x, y);
	        image.setRGB(x, y, rgb);
	      }
	    }

	    gdi32.DeleteObject(bitmap);
	    gdi32.DeleteDC(hdc);
	  }

	  public static void main(String[] args) {
	    final int width = 128;
	    final int height = 128;

	    BufferedImage image = new BufferedImage(width, height,
	        BufferedImage.TYPE_INT_ARGB);
	    draw(image, User32.IDC_HAND, User32.DI_NORMAL);
	    BufferedImage mask = new BufferedImage(width, height,
	        BufferedImage.TYPE_INT_RGB);
	    draw(mask, User32.IDC_HAND, User32.DI_MASK);
	    applyMask(image, mask);

	    JLabel icon = new JLabel();
	    icon.setIcon(new ImageIcon(image));

	    JFrame frame = new JFrame();
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setContentPane(icon);
	    frame.pack();
	    frame.setVisible(true);
	  }

	  private static void applyMask(BufferedImage image,
	      BufferedImage mask) {
	    int width = image.getWidth();
	    int height = image.getHeight();
	    for (int x = 0; x < width; x++) {
	      for (int y = 0; y < height; y++) {
	        int masked = mask.getRGB(x, y);
	        if ((masked & 0x00FFFFFF) == 0) {
	          int rgb = image.getRGB(x, y);
	          rgb = 0xFF000000 | rgb;
	          image.setRGB(x, y, rgb);
	        }
	      }
	    }
	  }

	}


判断鼠标是否是默认样式
import com.sun.jna.Pointer;

public class CursorTest {

	public static boolean isDefaultCursor() {

		final int width = 128;
		final int height = 128;

		User32 user32 = User32.INSTANCE;
		Gdi32 gdi32 = Gdi32.INSTANCE;

		Pointer hIcon = user32.LoadCursorW(Pointer.NULL, User32.IDC_HAND);
		Pointer hdc = gdi32.CreateCompatibleDC(Pointer.NULL);
		Pointer bitmap = gdi32.CreateCompatibleBitmap(hdc, width, height);

		gdi32.SelectObject(hdc, bitmap);
		user32.DrawIconEx(hdc, 0, 0, hIcon, width, height, 0, Pointer.NULL,
				User32.DI_MASK);

		for (int x = 0; x < width; x++) {
			for (int y = 0; y < width; y++) {
				int rgb = gdi32.GetPixel(hdc, x, y);
				// System.out.print(rgb+",");
				if (rgb == 0)
					return true;
			}
		}

		return false;
	}

	public static void main(String[] args) {

		boolean defaultCursor = isDefaultCursor();
		System.out.println(defaultCursor);
	}

}


相关类:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

public interface Gdi32 extends Library {

	  public static Gdi32 INSTANCE = (Gdi32) Native
	      .loadLibrary("Gdi32", Gdi32.class);

	  /** http://msdn.microsoft.com/en-us/library/dd183489(VS.85).aspx */
	  public Pointer CreateCompatibleDC(Pointer hdc);

	  /** http://msdn.microsoft.com/en-us/library/dd183488(VS.85).aspx */
	  public Pointer CreateCompatibleBitmap(Pointer hdc,
	      int nWidth, int nHeight);

	  /** http://msdn.microsoft.com/en-us/library/dd162957(VS.85).aspx */
	  public Pointer SelectObject(Pointer hdc, Pointer hgdiobj);

	  /** http://msdn.microsoft.com/en-us/library/dd145078(VS.85).aspx */
	  public int SetPixel(Pointer hdc, int X, int Y, int crColor);

	  /** http://msdn.microsoft.com/en-us/library/dd144909(VS.85).aspx */
	  public int GetPixel(Pointer hdc, int nXPos, int nYPos);

	  /** http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx */
	  public boolean DeleteObject(Pointer hObject);

	  /** http://msdn.microsoft.com/en-us/library/dd183533(VS.85).aspx */
	  public boolean DeleteDC(Pointer hdc);

	}


import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

public interface User32 extends Library {

	  public static User32 INSTANCE = (User32) Native
	      .loadLibrary("User32", User32.class);

	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_ARROW = 32512;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_IBEAM = 32513;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_WAIT = 32514;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_CROSS = 32515;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_UPARROW = 32516;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_SIZENWSE = 32642;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_SIZENESW = 32643;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_SIZEWE = 32644;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_SIZENS = 32645;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_SIZEALL = 32646;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_NO = 32648;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_HAND = 32649;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_APPSTARTING = 32650;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_HELP = 32651;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_ICON = 32641;
	  /** @see #LoadCursorW(Pointer, int) */
	  public static final int IDC_SIZE = 32640;

	  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
	  public static final int DI_COMPAT = 4;
	  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
	  public static final int DI_DEFAULTSIZE = 8;
	  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
	  public static final int DI_IMAGE = 2;
	  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
	  public static final int DI_MASK = 1;
	  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
	  public static final int DI_NORMAL = 3;
	  /** @see #DrawIconEx(Pointer, int, int, Pointer, int, int, int, Pointer, int) */
	  public static final int DI_APPBANDING = 1;

	  /** http://msdn.microsoft.com/en-us/library/ms648391(VS.85).aspx */
	  public Pointer LoadCursorW(Pointer hInstance,
	      int lpCursorName);

	  /** http://msdn.microsoft.com/en-us/library/ms648065(VS.85).aspx */
	  public boolean DrawIconEx(Pointer hdc, int xLeft,
	      int yTop, Pointer hIcon, int cxWidth, int cyWidth,
	      int istepIfAniCur, Pointer hbrFlickerFreeDraw,
	      int diFlags);

	}
分享到:
评论

相关推荐

    vs调整界面的鼠标样式

    1. **安装扩展**:首先,你需要访问Visual Studio Marketplace,搜索与鼠标样式相关的扩展,如“Mouse Pointer Customizer”等。安装这些扩展后,它们会提供额外的设置选项来更改鼠标样式。 2. **个性化设置**:在...

    鼠标样式更改为vista

    下面,我们将详细介绍如何更改Windows XP的鼠标样式为Vista样式,并探讨这个过程中的相关知识点。 首先,更改鼠标样式通常涉及到修改系统资源文件,这些文件包含了鼠标指针的不同形状和动画效果。在Windows XP中,...

    C# 自定义鼠标样式

    ### C#自定义鼠标样式的实现方法 在C#中,自定义鼠标样式是一个非常实用的功能,尤其是在开发具有高度定制化界面的应用程序时。本文将详细介绍如何通过调用Windows API来实现这一功能,并提供示例代码帮助理解。 #...

    备忘:兼容ff和ie的鼠标样式+javascript字符串hash+浮动提示

    标题中的“兼容ff和ie的鼠标样式”指的是在网页开发中,不同的浏览器(如Firefox和Internet Explorer)可能对CSS样式的解析存在差异,导致鼠标指针样式显示不一致的问题。解决这个问题通常需要编写特定的CSS hack...

    冒险岛手型鼠标.rar

    而这款“冒险岛手型鼠标”则是针对这款游戏的特色,设计出的一款独特的鼠标指针样式,它可能包含了一些与游戏主题相关的图案或动画效果,使得玩家在游戏时更有代入感。 接下来,我们要了解如何安装和启用这个鼠标...

    做自己喜欢的鼠标

    此外,软件本身的安全性和兼容性也是使用时需要关注的问题,确保下载来源可靠,并且能与自己的操作系统良好配合。 总的来说,"做自己喜欢的鼠标"这个工具为用户提供了发挥创意的空间,让鼠标不仅仅是操作设备,更是...

    如何修改鼠标指针样式.docx

    如果你遇到鼠标问题,可以在此查看设备状态,或者更新驱动程序。 完成上述设置后,记得点击“应用”和“确定”以保存更改。需要注意的是,某些特殊指针样式可能需要安装额外的鼠标指针包才能使用。如果你需要更多...

    如何设置Windows8系统鼠标指针样式.docx

    请注意,改变鼠标指针样式可能需要管理员权限,如果遇到权限问题,确保你以管理员身份登录。此外,如果你对新的鼠标指针样式不满意,可以通过同样的路径返回,选择之前的样式进行还原。 总的来说,设置Windows 8的...

    鼠标悬停改变鼠标默认样式特效代码

    1. CSS 鼠标样式自定义: CSS允许我们自定义鼠标的光标样式,通过`cursor`属性可以实现。例如,我们想在鼠标悬停时显示一个指向左的箭头,可以这样设置: ```css .image:hover { cursor: url('images/left-...

    动态鼠标 动态鼠标 动态鼠标 动态鼠标 动态鼠标

    通常,这样的文档会指导用户如何下载驱动程序,如何在操作系统中正确安装,以及如何设置和调整动态鼠标的相关参数。用户可能需要根据自己的操作系统(如Windows、MacOS或Linux)来执行特定的安装步骤。此外,该文件...

    鼠标美化包,直接安装可以使用

    这种美化包通常包含了一系列预设的鼠标主题和指针样式,用户只需下载并安装,无需复杂的设置步骤,即可轻松更改鼠标样式。 【描述】:“鼠标美化包,直接安装可以使用” 这个描述简洁明了地传达了该美化包的核心...

    动态鼠标 动态鼠标 动态鼠标

    而"技术支持.url"则是一个快捷方式,指向提供动态鼠标相关技术支持的网站,用户在遇到问题时可以方便地获取帮助。至于"skycx.com",这可能是提供动态鼠标服务或产品的公司网站,用户可以在这里了解更多关于动态鼠标...

    div css移动鼠标改变样式弹出div层

    本话题主要探讨如何利用 `div` 和 `css` 实现一个动态效果:当鼠标移动到特定`div`上时,能够改变样式并弹出一个相关信息的`div`层。 首先,我们需要创建两个`div`元素:一个作为主内容区域,另一个作为弹出层。在...

    控制鼠标进行相关操作

    2. **鼠标设置**:操作系统中一般都包含鼠标设置选项,用户可以调整鼠标的速度、指针样式、滚轮滚动行数等。鼠标速度决定了指针在屏幕上的移动速率,有些人喜欢快节奏,有些人则偏好慢速稳定。此外,还可以自定义...

    炫酷鼠标指针.bat

    描述中的内容同样简单明了,暗示这个BAT文件与定制或改变鼠标指针有关,可能是为了提升用户的桌面体验,增加视觉效果。 标签“鼠标 bat”进一步确认了这一点,意味着主要涉及的是与鼠标操作相关的批处理脚本。 在...

    星际争霸鼠标方案

    同时,它也可能具有兼容老版游戏的功能,比如通过模拟旧版鼠标的输入行为,以适应可能存在的兼容性问题。 在提供的压缩包文件中,我们可以看到三个不同的RAR文件:"Cursors_Startcraft.rar"、"星际鼠标.rar"和...

    windows下转成mac的指针样式

    - 如果指针样式没有改变,可能是因为系统权限问题,尝试以管理员模式运行个性化设置。 - 若新指针样式在某些程序中显示异常,可能是这些程序使用了自定义的指针,此时需单独设置或联系程序开发者解决。 需要注意...

    Win7鼠标指针

    如果遇到与鼠标指针相关的技术问题,可以尝试重启电脑,更新操作系统补丁,或者使用Windows内置的“疑难解答”工具来排查问题。 综上所述,"Win7鼠标指针"涵盖了从系统默认设置到自定义个性化,再到故障排查与性能...

    苹果Mac鼠标主题下载

    2. **在Mac上自定义鼠标主题**:在Mac上,虽然系统提供的个性化选项相对有限,但用户可以通过第三方应用或下载特定的鼠标主题文件来更改鼠标样式。这些文件通常以.dmg或.zip格式提供,包含了一系列的图像文件,用于...

    Windows XP鼠标指针

    "技术支持.url"则是一个快捷方式,链接到相关的技术支持网站,用户在遇到问题时可以寻求帮助。而"skycx.com"可能是提供该主题包的网站或者开发者的信息,用户可以访问获取更多类似资源或者了解更新。 总的来说,...

Global site tag (gtag.js) - Google Analytics