还是findwindowex问题,能详细说一下各参数用法吗啊?谢谢
FindWindowEx
函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
函数原型:HWND FindWindowEx(HWND1 hwndParent,HWND2 hwndChildAfter,LPCTSTR1 lpszClass,LPCTSTR2 lpszWindow);
参数;
hwndParent:要查找子窗口的父窗口句柄。如果hwndParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数。
在窗口列表中寻找与指定条件相符的第一个子窗口
返回值:Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 String,欲搜索的类名。零表示忽略
lpsz2 String,欲搜索的窗体名。零表示忽略
VB:FindWindowEx 用途,参数
在窗口列表中寻找与指定条件相符的第一个子窗口 。
该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
VB 声明
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
参数;
(1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。
如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
(2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
(3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
(4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。
如何使用FindWindowEx获取窗体内控件句柄
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpclassname, string lpwindowname);
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndparent, IntPtr hwndchildafter, string lpszclass, string lpszwindow);
IntPtr hwnd_win;
IntPtr hwnd_button;
hwnd_win = FindWindow("windowsforms10.window.8.app3", "form1");
hwnd_button = FindWindowEx(hwnd_win, new IntPtr(0), "windowsforms10.button.app3", "button1");
VB中findwindowex函数的用法。。
FindWindowEx函数
函数功能:在窗口列表中寻找与指定条件相符的第一个子窗口 。
该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
参数:(1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。
如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
(2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
(3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
(4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。
返回值:Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
若想获得更多错误信息,请调用GetLastError函数。
声明:1.VB 声明
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
2.C# 声明
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
3.VB .NET 声明
_
Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
ByVal childAfter As IntPtr, _
ByVal lclassName As String, _
ByVal windowTitle As String) As IntPtr
End Function
相关例子:
'Example Name: Changing a VB Toolbar to a Rebar-Style Toolbar
BAS Moduel Code
Option Explicit
Public Const WM_USER= &H400
Public Const TB_SETSTYLE = WM_USER + 56
Public Const TB_GETSTYLE = WM_USER + 57
Public Const TBSTYLE_FLAT = &H800
Public Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Public Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
'--end block--'
' Form Code
Option Explicit
Private Sub Form_Load()
With Combo1
.Width = Toolbar1.Buttons("combo1").Width
.Top = (Toolbar1.Height - Combo1.Height) \ 2
.Left = Toolbar1.Buttons("combo1").Left
.AddItem "Black" ' Add colours for text.
在VB中,已知主窗口句柄,如何用FindWindowEx找到第二个文本框的句柄
首先,一个窗口的句柄根本不是固定的,所以用常量来表示一个窗口句柄是不合适的。VB的窗体都有一个名为hWnd的属性,这个属性里保存的就是这个窗口的句柄。其次,“#32770”是普通窗体的窗口类名,如果要找这样的窗口,可以用handle = FindWindow(窗口类名, 窗口名)来寻找它。 如果要寻找子窗口的句柄,假设父窗口的句柄为phandle,那么可以用chandle = FindWindowEx(phandle, 0, 子窗口类名, vbNullString)来完成。此时,找到的是父窗口内第一个类名为“子窗口类名”的子窗口。如果要找到下一个子窗口,需要用chandle2 = FindWindowEx(phandle, chandle, 子窗口类名, vbNullString)来完成。现在,已经知道了第一个子窗口的句柄为h1,子窗口类名为"EDIT",那么我们可以用如下语句来寻找第二个子窗口:h2 = FindWindowEx(874523, h1, "EDIT", vbNullString)不过还是建议用一个变量来保存父窗口的句柄。顺便说一下,如果此时h2为0,那就是说,这个父窗口内没有第二个类名为"EDIT"的子窗口了。
如何用C#获取外部程序(VC写的)窗口中某个按钮的句柄并执行点击操作?
static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)]
extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[STAThread]
static void Main(string[] args)
{
string path = "..\\..\\..\\AUT3\\bin\\Debug\\AUT3.exe";
Process p = Process.Start(path);
if (p==null)
Console.WriteLine("Warning:process may already exist");
Console.WriteLine("Finding main window handle");
IntPtr mwh = FindMainWindowHandle("Form1", 100, 25);
Console.WriteLine("Handle to main window is " + mwh);
//有名字控件句柄
Console.WriteLine("Findding handle to textbox1");
IntPtr tb = FindWindowEx(mwh, IntPtr.Zero, null, "");
if (tb == IntPtr.Zero)
throw new Exception("Unable to find textbox1");
else
Console.WriteLine("Handle to textbox1 is " + tb);
Console.WriteLine("Findding handle to button1");
IntPtr butt = FindWindowEx(mwh, IntPtr.Zero, null, "button1");
if (butt == IntPtr.Zero)
throw new Exception("Unable to find button1");
else
Console.WriteLine("Handle to button1 is " + butt);
//没有名字或者重名控件
Console.WriteLine("Findding handle to listbox1");
IntPtr lb = FindWindowByIndex(mwh,3);
if (lb == IntPtr.Zero)
throw new Exception("Unable to find listbox1");
else
Console.WriteLine("Handle to listbox1 is " + lb);
}
方法:
//通过索引查找相应控件句柄
static IntPtr FindWindowByIndex(IntPtr hwndParent,int index)
{
if (index == 0)
{
return hwndParent;
}
else
{
int ct = 0;
IntPtr result = IntPtr.Zero;
do
{
result = FindWindowEx(hwndParent,result,null,null);
if (result != IntPtr.Zero)
{
++ct;
}
} while (ct<index&&result!=IntPtr.Zero);
return result;
}
}
//获得待测程序主窗体句柄
private static IntPtr FindMainWindowHandle(string caption,int delay,int maxTries)
{
IntPtr mwh = IntPtr.Zero;
bool formFound = false;
int attempts = 0;
while (!formFound && attempts < maxTries)
{
if (mwh == IntPtr.Zero)
{
Console.WriteLine("Form not yet found");
Thread.Sleep(delay);
++attempts;
mwh = FindWindow(null, caption);
}
else
{
Console.WriteLine("Form has been found");
formFound = true;
}
}
if (mwh == IntPtr.Zero)
throw new Exception("Could not find main window");
else
return mwh;
FindWindow
FindWindowEx
vb 隐藏已知句柄的窗口 & vb FindWindowEx的用法
隐藏窗口用ShowWindow 或者SetWindowPos
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
用法ShowWindow a,SW_HIDE (SW_HIDE = 0)
FindWindowEx
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
hWnd1 ---------- Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
hWnd2 ---------- Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
lpsz1 ---------- String,欲搜索的类名。零表示忽略
lpsz2 ---------- String,欲搜索的类名。零表示忽略
托盘图标句柄不知道怎么搞
VB在已知句柄的窗口画圆并清除。
vb-画圆创建一个工程,窗口上面放一个PictureBox,大小相对大一些,将其ScaleMode属性设为3。然后放一个按钮,其中加入以下代码: '这段代码演示了如何使用VB的Circle方法绘制各种各样的圆。 Form1.Picture1.Circle (60, 60), 40, vbRed '画一个圆心(60,60)半径40的红色的圆(默认空心)Form1.Picture1.FillStyle = 0 '设定填充模式为实心 Form1.Picture1.FillColor = vbBlue '设定填充色蓝色 Form1.Picture1.Circle (190, 60), 40, vbRed '下来画出来的就是填充了实心蓝色的圆了Form1.Picture1.DrawWidth = 3 '设定边框宽度为3 Form1.Picture1.Circle (60, 190), 40, vbRed '这次绘制出来的圆边框粗细为3 Form1.Picture1.DrawStyle = 5 '设定边框不可见 Form1.Picture1.FillColor = vbRed '设定填充色红色 Form1.Picture1.Circle (190, 190), 40 '这次绘制出来一个无边框、填充颜色是红色的圆 Form1.Picture1.Refresh然后试试看,对照注释应该就明白了。