java在win10下监控指定文件夹的窗口,如果打开,则关闭

要实现监听win10的窗口信息,一旦有被指定的文件夹被打开,则直接关闭,这里注意CloseWindow、DestroyWindow原理,不能关闭其他程序的窗口进程,java由于JDK版本问题  引入的JNA一直报错,务必注意 引入包的版本 jna-platform-5.5.0.jar jna-5.5.0.jar JKD1.8

问题:

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.win32.StdCallLibrary;
 
public class TryWithHWND {
   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg);
      int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);
   }
 
   public static void main(String[] args) {
      final User32 user32 = User32.INSTANCE;
      user32.EnumWindows(new WNDENUMPROC() {
         int count = 0;
         @Override
         public boolean callback(HWND hWnd, Pointer arg1) {
            byte[] windowText = new byte[512];
            user32.GetWindowTextA(hWnd, windowText, 512);
            String wText = Native.toString(windowText);
 
            // get rid of this if block if you want all windows regardless of whether
            // or not they have text
            if (wText.isEmpty()) {
               return true;
            }
            if(wText.contains("test")) {
                System.out.println("testFolder:"+ wText);
            }
            System.out.println("Found window with text " + hWnd + ", total " + ++count
                  + " Text: " + wText);
            return true;
         }
      }, null);
   }
}

由于本次需求要监控的文件夹名称是固定的,如果不固定,则需要遍历所有的窗口名称,如上图,如果需要处理的是子窗口或者窗口的控件句柄,强烈推荐spy++工具,先分析找出对应的控件句柄,解决就不远了,其实该问题很容易,不过java调用win下的native方法,由于win版本、JDK版本以及引包版本  解决过程极其痛苦,几无参考资料,解决该问题后,基本win下的底层函数都研究了一遍,有备无患

最终解决方式: 务必注意 引入包的版本 jna-platform-5.5.0.jar jna-5.5.0.jar JKD1.8  如下函数

	   /**
	    * 
	    * Func:通过窗口标题获取窗口句柄
	    * Data: 2020-03-23
	    * @param windowName
	    * @return
	    */
	    public static void closewindow(String windowName){
	    	//通过窗口标题获取窗口句柄
	        WinDef.HWND hWnd = com.sun.jna.platform.win32.User32.INSTANCE.FindWindow("CabinetWClass" ,windowName);
	        if (hWnd==null)   //throw new RuntimeException("窗口不存在,请先运行程序");
	        	System.out.println("窗口不存在,请继续等待");
	        else {
	        	// 0x10 关闭窗口信号    lresult 0 关闭成功
	        	LRESULT lresult= com.sun.jna.platform.win32.User32.INSTANCE.SendMessage(hWnd, 0X10, null, null);
	        	System.out.println("lresult:"+lresult);
	        }
	    }

 

你可能感兴趣的:(Java技术)