用java通过调用C++的DLL文件来修改系统分辨率(一)

来源:互联网 发布:淘宝寄错东西了怎么办 编辑:程序博客网 时间:2024/06/08 10:27

一、多个显示器的模式

1、  更大的windows桌面,在多显示器模式下,可以把多个显示器的显示区域结合在一起来显示Windows桌面,不管这些显示器的尺寸、物理位置、分辨率和刷新频率是否相同。当我们运行一个应用程序时,程序的主窗口可以位于任何一个显示器的显示区域内,也可以跨多个显示区域。我们也可以把一个程序的窗口从一个显示区域移到另一个显示区域中。

2、  复制模式:指各个显示屏的分辨率都是一样的,位置是0——分辨率值。

3、  扩展模式:首先Windows系统会识别一个主显示器,这个可以在屏幕分辨率中更改。多个显示器之间的位置关系也可以再屏幕分辨率中更改。其中主显示器的位置为(0,0)到(width,height),其他显示器位置由与主显示器的位置关系决定,在主显示器左上,则为负数,用0减去长宽;在右下,则由主显示器的分辨率加上长宽。其中驱动或用mouse_event处理时也是一样,主显示器为0~65535,其他显示器根据主显示器的相对位置确定。

问题:项目多显卡多屏是采用的哪种模式。

二、Java的swing开发提供的相应功能

1、  sigar.jar包读取系统信息,从API上来看,只是获取到系统信息,不能对windows系统进行设置。

2、  获取显示器信息并显示在对应的显示器上

GraphicsEnvironment ge =GraphicsEnvironment.getLocalGraphicsEnvironment();   GraphicsDevice[] gs = ge.getScreenDevices();   for (int j = 0; j < gs.length; j++) {      GraphicsDevice gd = gs[j];      GraphicsConfiguration[] gc =        gd.getConfigurations();      for (int i=0; i < gc.length; i++) {         JFrame f = new         JFrame(gs[j].getDefaultConfiguration());         Canvas c = new Canvas(gc[i]);         Rectangle gcBounds = gc[i].getBounds();         int xoffs = gcBounds.x;         int yoffs = gcBounds.y;           f.getContentPane().add(c);           f.setLocation((i*50)+xoffs, (i*60)+yoffs);         f.show();      }    }


问题:通过baidu和google的搜索并未找到相应的java控制显卡的解决方案。

三、VS中实现的相应功能

1、  C#:可以实现对显示器的屏幕更改。

2、  C++:提供了通过windows系统对数据的读取。

问题:系统要求是用java编写C/S模式程序,要把C#和C++与java结合起来

四、推荐解决方案

用java调用dll文件来实现对显卡显示器的控制,vs中要用C++来编写dll文件,C#不可行,因为C#生产的dll文件严格上来讲不是windows系统上的dll文件,如需使用,还要添加别的步骤才行。

Java调用dll文件的方式:jni,jna,jnative

本人采用的是jnative方式调用。

原创粉丝点击