zoukankan      html  css  js  c++  java
  • 通过Win API 模拟鼠标点击,使C# Java交互 (PART.2 Java部分)

    Java部分:
       调用:
      
    ArrayList<QueueItem> li = new ArrayList<QueueItem>();
            li.add(
    new QueueItem("WindowsForms10.Window.8.app3","采集系统"));
            li.add(
    new QueueItem("WindowsForms10.BUTTON.app3","选项"));
            
    int result = NativeWin32.ClickOnWindow(li);
            System.
    out.print(result);

    PINVOKE封装采用 NativeCall [ http://johannburkard.de/software/nativecall/ ]

    QueueItem,窗体查找时的节点定义.
    public class QueueItem
    {
        
    public String ClassName;
        
    public String WindowCaption;
        
    public boolean IsParent=true;
        
    public QueueItem(String className,String windowCaption)
        
    {
            ClassName
    =className;
            WindowCaption
    =windowCaption;
        }

        
    public QueueItem(String className,String windowCaption,boolean isParent)
        
    {
            ClassName
    =className;
            WindowCaption
    =windowCaption;
            IsParent
    =isParent;
        }

    }


    API

    import com.eaio.nativecall.IntCall;

    public class NativeWin32 {
        
        
    public static Integer FindWindow(String sClassName,String sWindowName)
        
    {
            IntCall iCall 
    = new IntCall("user32""FindWindowW");
            
    int iRet = iCall.executeCall(
                    
    new Object[] {
                            sClassName,
                            sWindowName}
    );
            iCall.destroy();
            
    return new Integer(iRet);
        }

        
    public static Integer FindWindowEx(Integer hwndParent,Integer hwndChildAfter,String sClassName,String sWindowName)
        
    {
            IntCall iCall 
    = new IntCall("user32""FindWindowExW");
            
    int iRet = iCall.executeCall(
                    
    new Object[] {
                            hwndParent,
                            hwndChildAfter,
                            sClassName,
                            sWindowName}
    );
            iCall.destroy();
            
    return new Integer(iRet);
        }

        
        
    private static final int WM_GETTEXT = 0x000D
        
    private static final int WM_SETTEXT = 0x000C
        
    private static final int WM_CLICK = 0x00F5
        
    private static final int SW_MAXIMIZE = 3;
        
    private static final int SW_SHOWNORMAL = 1;
        
    private static Integer SendMessage(Integer hwnd,int msg,Integer wParam,String lParam)
        
    {
            IntCall iCall 
    = new IntCall("user32""SendMessageW");
            
    int iRet = iCall.executeCall(
                    
    new Object[] {
                            hwnd,
                            msg,
                            wParam,
                            lParam}
    );
            iCall.destroy();
            
    return new Integer(iRet);
        }

        
    public static void SetForegroundWindow(Integer hwnd)
        
    {
            IntCall iCall 
    = new IntCall("user32""SetForegroundWindow");
            iCall.executeCall(
                    
    new Object[] {
                            hwnd}
    );
            iCall.destroy();
        }

        
    public static void ShowWindow(Integer hwnd,int size)
        
    {
            IntCall iCall 
    = new IntCall("user32""ShowWindow");
            iCall.executeCall(
                    
    new Object[] {
                            hwnd,
                            size}
    );
            iCall.destroy();
        }

        
        
    public static int ClickOnWindow(java.util.ArrayList<QueueItem> queue)
        
    {
            
    int result = -1;
            Integer ParenthWnd 
    = new Integer(0); 
            Integer ChildhWnd 
    = new Integer(0); 

            QueueItem q 
    = queue.get(result+1);

            
    //查到窗体,得到整个窗体 
            ParenthWnd = FindWindow(q.ClassName,q.WindowCaption); 
            
    //判断这个窗体是否有效 
            if (ParenthWnd!=0
            

                ShowWindow(ParenthWnd,SW_SHOWNORMAL);
                SetForegroundWindow(ParenthWnd);
    //激活窗体
                result++;

                
    while(result+1<queue.size())
                
    {
                    q 
    = queue.get(result+1);
                    ChildhWnd 
    = FindWindowEx(ParenthWnd,0,q.ClassName,q.WindowCaption); 
                    
    if (ChildhWnd!=0
                    

                        
    if(q.IsParent)
                            ParenthWnd
    =ChildhWnd;
                        result
    ++;
                    }
    else
                        
    break;
                }


                
    //得到了Button ? 触发它的Click事件 
                if (ChildhWnd!=0 && queue.size()==result+1
                

                    SendMessage(ChildhWnd,WM_CLICK,
    0,"0");
                }
     
            }
     

            
    return result; 
        }

    }
  • 相关阅读:
    C# 获取文件名、无后缀文件名、扩展名
    navicat for oracle 导入xlsx文件提示无法打开xlsx文件
    复制的文件不能粘贴到远程的服务器上
    使用.bat 批量将部分文件迁移到新的路径下
    sql sever 查询用户所有的表和各个表数据量
    orecle 查询数量 union合并 的排序问题
    oracle 如何将带有,的一列分成多列
    java中selenium判断某个元素是否存在
    docker安装Ubuntu以及ssh连接
    Java8 将List<JavaBean>中某个属性取出来为单独的一个集合List<String>
  • 原文地址:https://www.cnblogs.com/crabo/p/591131.html
Copyright © 2011-2022 走看看