通過Win API 類比滑鼠點擊,使C# Java互動 (PART.1 C#部分)

來源:互聯網
上載者:User
首先是C# 部分:
   調用:
  

System.Collections.Queue q = new Queue();
            q.Enqueue(new QueueItem("ThunderRT6FormDC","Spy++ Lite V2.1"));
            q.Enqueue(new QueueItem("SSTabCtlWndClass",""));
            q.Enqueue(new QueueItem("ThunderRT6CommandButton","儲存(&S)"));
            int i= NativeWin32.ClickOnWindow(q);
            MessageBox.Show(i.ToString());

以上逐級從表單找到Tab頁, 在遭到按鈕, 最終將觸發點擊.
最終的傳回值I將體現當前已尋找成功的層級.

PINVOKE封裝:using System;
using System.Runtime.InteropServices; 

namespace RemoteCam
{
    public class QueueItem
    {
        public string ClassName;
        public string WindowCaption;
        public bool IsParent=true;
        public QueueItem(string className,string windowCaption)
        {
            ClassName=className;
            WindowCaption=windowCaption;
        }
        public QueueItem(string className,string windowCaption,bool isParent)
        {
            ClassName=className;
            WindowCaption=windowCaption;
            IsParent=isParent;
        }
    }
    public class NativeWin32
    {
        //Get Text / Set Text /Click
        public const int WM_GETTEXT = 0x000D; 
        public const int WM_SETTEXT = 0x000C; 
        public const int WM_CLICK = 0x00F5; 
        public const int SW_MAXIMIZE = 0x0003;
        public const int SW_SHOWNORMAL = 0x0001;

        [DllImport("User32.dll",EntryPoint="FindWindow")] 
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
 
        [DllImport("user32.dll",EntryPoint="FindWindowEx")] 
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
 
        [DllImport("User32.dll",EntryPoint="SendMessage")] 
        public static extern int SendMessage(IntPtr hwnd, int Msg, IntPtr wParam, string lParam); 

        [DllImport("user32.dll",EntryPoint="SetForegroundWindow")]
        public static extern void SetForegroundWindow(IntPtr hwnd);

        [DllImport("user32.dll",EntryPoint="ShowWindow")]
        public static extern void ShowWindow(IntPtr hwnd,int size);


        public static int ClickOnWindow(System.Collections.Queue queue)
        {
            int result = -1;
            IntPtr ParenthWnd = new IntPtr(0); 
            IntPtr ChildhWnd = new IntPtr(0); 
 
            QueueItem q = (QueueItem)queue.Dequeue();

            //查到表單,得到整個表單 
            ParenthWnd = FindWindow(q.ClassName,q.WindowCaption); 
            //判斷這個表單是否有效 
            if (!ParenthWnd.Equals(IntPtr.Zero)) 
            { 
                ShowWindow(ParenthWnd,SW_SHOWNORMAL);
                SetForegroundWindow(ParenthWnd);//啟用表單
                result++;

                while(queue.Count>0)
                {
                    q = (QueueItem)queue.Dequeue();
                    ChildhWnd = FindWindowEx(ParenthWnd,(IntPtr)0,q.ClassName,q.WindowCaption); 
                    if (!ChildhWnd.Equals(IntPtr.Zero)) 
                    { 
                        if(q.IsParent)
                            ParenthWnd=ChildhWnd;
                        result++;
                    }else
                        break;
                }

                //得到了Button ? 觸發它的Click事件 
                if (!ChildhWnd.Equals(IntPtr.Zero) && queue.Count==0) 
                { 
                    SendMessage(ChildhWnd,WM_CLICK,(IntPtr)0,"0");
                } 
            } 
 
            return result; 
        }
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.