首先是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;
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace
RemoteCam
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
public class QueueItem
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public string ClassName;
public string WindowCaption;
public bool IsParent=true;
public QueueItem(string className,string windowCaption)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ClassName=className;
WindowCaption=windowCaption;
}
public QueueItem(string className,string windowCaption,bool isParent)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ClassName=className;
WindowCaption=windowCaption;
IsParent=isParent;
}
}
public class NativeWin32
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//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;
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[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);
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("user32.dll",EntryPoint="SetForegroundWindow")]
public static extern void SetForegroundWindow(IntPtr hwnd);
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[DllImport("user32.dll",EntryPoint="ShowWindow")]
public static extern void ShowWindow(IntPtr hwnd,int size);
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static int ClickOnWindow(System.Collections.Queue queue)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int result = -1;
IntPtr ParenthWnd = new IntPtr(0);
IntPtr ChildhWnd = new IntPtr(0);
QueueItem q = (QueueItem)queue.Dequeue();
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//查到窗体,得到整个窗体
ParenthWnd = FindWindow(q.ClassName,q.WindowCaption);
//判断这个窗体是否有效
if (!ParenthWnd.Equals(IntPtr.Zero))
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ShowWindow(ParenthWnd,SW_SHOWNORMAL);
SetForegroundWindow(ParenthWnd);//激活窗体
result++;
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
while(queue.Count>0)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
q = (QueueItem)queue.Dequeue();
ChildhWnd = FindWindowEx(ParenthWnd,(IntPtr)0,q.ClassName,q.WindowCaption);
if (!ChildhWnd.Equals(IntPtr.Zero))
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(q.IsParent)
ParenthWnd=ChildhWnd;
result++;
}else
break;
}
![InBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//得到了Button ? 触发它的Click事件
if (!ChildhWnd.Equals(IntPtr.Zero) && queue.Count==0)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SendMessage(ChildhWnd,WM_CLICK,(IntPtr)0,"0");
}
}
return result;
}
}
}