13行代码使用JAVA去除Win下任意软件标题栏

项目需求将VNC Viewer的标题栏隐藏,也就是将一个远程桌面视口无边框地嵌入屏幕规定区域之中,之前的做法是将VNC Viewer放到屏幕最顶部,设置其XY坐标为负,将标题栏隐藏到视界之外。这样做既不美观,也容易被触摸屏或者鼠标给拖下来。 可以使用下面这些代码,将任意软件的标题栏隐藏(前提是32位系统,32位应用): ``` package com.newflypig.win32; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef.HWND; public class DeleteWindowTitle { public static void main(String[] args) { HWND hWnd = User32.INSTANCE.FindWindow(null, "HMI - VNC Viewer"); System.out.println(hWnd == null); if(hWnd != null){ User32.INSTANCE.ShowWindow(hWnd, 1); int style = User32.INSTANCE.GetWindowLong(hWnd, User32.GWL_STYLE); style = style & ~User32.WS_CAPTION & ~User32.WS_SYSMENU & ~User32.WS_SIZEBOX; User32.INSTANCE.SetWindowLong(hWnd, User32.GWL_STYLE, style); User32.INSTANCE.SetWindowPos(hWnd, new HWND(new Pointer(-1)), 100, 100, 800, 600, 0x0040 | 0x0020); } } } ``` 依赖项:jna gradle配置文件: ``` apply plugin: "java" apply plugin: "war" apply plugin: "eclipse" sourceCompatibility = 1.8 version = '1.0' ext{ jna_version = "4.2.2" } configurations { provided } sourceSets { main.compileClasspath += configurations.provided test.compileClasspath += configurations.provided test.runtimeClasspath += configurations.provided } repositories { maven {url "http://maven.aliyun.com/nexus/content/groups/public" } } dependencies { compile( "net.java.dev.jna:jna:${jna_version}", "net.java.dev.jna:jna-platform:${jna_version}", ) } eclipse.classpath.plusConfigurations += [configurations.provided] ```

使用JNA寻找第三方窗体程序,并移动到指定位置

使用JNA寻找第三方窗体程序,并移动到指定位置 需求场景:在Windows环境下,查找标题为xxx的窗体,并将其固定在指定位置,如果查询不到则打开指定路径下的该程序。 使用JNA可以方便的调用平台相关的函数,这让JAVA能够通过JNA调用很多JVM沙盒以外的函数。 首先引入JNA的JAR包,这里使用gradle快速引入: ``` apply plugin: "java" apply plugin: "eclipse" sourceCompatibility = 1.8 version = '1.0' ext{ jna_version = "4.2.2" } sourceSets { main{ resources.srcDirs = ["src"] //引入资源文件,打包时才会将配置文件植入war文件 } } repositories { maven {url "https://maven.aliyun.com/nexus/content/groups/public" } //maven {url "https://uk.maven.org/maven2" } //mavenLocal() //mavenCentral() //jcenter() } dependencies { compile( "net.java.dev.jna:jna:${jna_version}", "net.java.dev.jna:jna-platform:${jna_version}" ) } task copyJars(type:Copy) { from configurations.runtime into 'dist' // 目标位置 } ``` JAVA中使用以下代码寻找窗体,并固定位置 ``` HWND hWnd = User32.INSTANCE.FindWindow(title,null); //使用标题寻找窗体 HWND hWnd = User32.INSTANCE.FindWindow(null,class); //使用类名寻找窗体 User32.INSTANCE.ShowWindow(hWnd, 1); //显示窗体,适用于最小化,或者处于z轴后面的窗体置前 //获取位置 WINDOWPLACEMENT wPlacement = new WINDOWPLACEMENT(); User32.INSTANCE.GetWindowPlacement(hWnd, wPlacement); if(x != wPlacement.rcNormalPosition.left || y != wPlacement.rcNormalPosition.top){ //控制位置 User32.INSTANCE.SetWindowPos(hWnd, new HWND(new Pointer(-1)), x, y, 0, 0, 0x0040 | 0x0001); } //如果并没有检索到当前窗体,则需要启动程序,有的程序可能需要参数,可直接在后面添加字符串 Runtime.getRuntime().exec("cmd /c \"" + filePath + "\""); ```

丁丁生于 1987.07.01 ,30岁,英文ID:newflydd

  • 现居住地 江苏 ● 泰州 ● 姜堰
  • 创建了 Jblog 开源博客系统
  • 坚持十余年的 独立博客 作者
  • 大学本科毕业后就职于 中国电信江苏泰州分公司,前两年从事Oracle数据库DBA工作,两年后公司精简技术人员,被安排到农村担任支局长(其本质是搞销售),于2016年因志向不合从国企辞职,在小城镇找了一份程序员的工作。
  • Git OSChina 上积极参与开源社区