1、启动VS,新建C# WinForm项目。
2、在Form1中添加4个Label控件,并布局如下。
3、在Form1中添加代码,如下。
4、完成之后,调试运行,结果如下。
注意事项:
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
首先你需要获得需要 *** 作窗体(A)的句柄。第二需要你获得窗体(A)中控件的ID号,比如文本框(Edit)控件的ID第三需要根据控件的ID获得控件的句柄(hwnd)第四根据hwnd对控件进行 *** 作明白了上述任务之后,那么下面的就是具体如何 *** 作了。第一:获得窗体的句柄 分为两种情况,窗体有标题和窗体没有标题有标题的窗体很简单使用window API中的FindWindow就很容易找到。HWnd hwnd = ::FindWindow(NULL,"窗体的标题名字");如果窗体没有标题,只知道窗体的类名那么也可以使用FindWindow。HWnd hwnd = ::FindWindow("窗体的类名",NULL); 如果窗体没有标题,也不知道类名。但窗体中的按钮或者文本可以明显看到,也是可以找到窗体的句柄的。可以使用函数EnumWindows和EnumWindowsProc 假设窗体没有标题,也不知道该窗体的类名,但知道窗体中有一个“登陆"按钮的名字。具体 *** 作如下:// 枚举已经打开的窗体,回调函数 BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam) { if(::IsWindowVisible(hWnd)) { wchar_t WindowTitle[100]={0}; /::GetWindowText(hWnd,WindowTitle,100); ::MessageBox(NULL,WindowTitle,NULL,MB_OK); / ::GetWindowText(hWnd,WindowTitle,100); CString str1=WindowTitle; UINT a=0; if(str1=="") { a = ::GetDlgItemText(hWnd,1,WindowTitle,100); CString str=WindowTitle; if(str == _T("登录")) { ((CAutoLoginDlg)lParam)->dhwnd = hWnd; return FALSE; } } return a==0; } return TRUE; } 调用方式:
HWND hWnd =NULL; EnumWindows(&EnumWindowsProc ,(LPARAM)this ); hWnd = this->dhwnd;OK 至此您已经获得窗体A的 *** 作句柄hwnd了。
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5
Private Sub Command1_Click()
Call List1_Click
End Sub
Private Sub Command2_Click()
Dim hwnd As Long
Dim s As String, t As String
List1Clear
hwnd = GetDesktopWindow()
s = String(256, Chr(0))
GetClassName hwnd, s, 255
s = Replace(s, Chr(0), "")
t = String(256, Chr(0))
GetWindowText hwnd, t, 255
t = Replace(t, Chr(0), "")
List1AddItem "桌面:" & hwnd & " 类名:" & s & " 标题:" & t & vbCrLf
hwnd = GetWindow(hwnd, GW_CHILD Or GW_HWNDFIRST)
s = String(256, Chr(0))
GetClassName hwnd, s, 255
s = Replace(s, Chr(0), "")
t = String(256, Chr(0))
GetWindowText hwnd, t, 255
t = Replace(t, Chr(0), "")
List1AddItem "窗口:" & hwnd & " 类名:" & s & " 标题:" & t & vbCrLf
While hwnd <> 0
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
s = String(256, Chr(0))
GetClassName hwnd, s, 255
s = Replace(s, Chr(0), "")
t = String(256, Chr(0))
GetWindowText hwnd, t, 255
t = Replace(t, Chr(0), "")
List1AddItem "窗口:" & hwnd & " 类名:" & s & "标题:" & t & vbCrLf
Wend
End Sub
Private Sub Form_Load()
Command1Caption = "获取所有控件"
Command2Caption = "遍历所有窗体"
End Sub
Private Sub EnumAllHandles(ByVal hwnd As Long)
Dim hn As Long
Dim firsthd As Long
Dim s As String, t As String
firsthd = GetWindow(hwnd, GW_CHILD)
firsthd = GetWindow(firsthd, GW_HWNDFIRST)
hn = firsthd
Do While hn <> 0
s = String(256, Chr(0))
GetClassName hn, s, 255
s = Replace(s, Chr(0), "")
t = String(256, Chr(0))
GetWindowText hn, t, 255
t = Replace(t, Chr(0), "")
Text1Text = Text1Text & "句柄:" & hn & " 父句柄:" & hwnd & " 类名:" & s & "标题:" & t & vbCrLf
TreeView1NodesAdd "k" & hwnd, tvwChild, "k" & hn, "句柄:" & hn & " 类名:" & s & "标题:" & t
EnumAllHandles hn
hn = GetWindow(hn, GW_HWNDNEXT)
If hn = firsthd Then Exit Do
Loop
End Sub
Private Sub List1_Click()
If List1ListIndex = -1 Then Exit Sub
TreeView1NodesClear
TreeView1NodesAdd , , "k" & Trim(Str(Val(Mid(List1Text, 4)))), List1Text
Text1Text = ""
EnumAllHandles Val(Mid(List1Text, 4))
TreeView1Nodes("k" & Trim(Str(Val(Mid(List1Text, 4)))))Expanded = True
End Sub
'添加两个按钮一个文本框一个列表框和一个树形图
1、GetWindowLong是获得有关指定窗口的信息,这个信息包括窗口扩展风格、标识、父句柄、风格等;通过第二个参数在控制的
2、GWL_EXSTYLE
获得扩展窗口风格。
GWL_HINSTANCE
获得应用事例的句柄。
GWL_HWNDPARENT
如果父窗口存在,获得父窗口句柄。
GWL_ID
获得窗口标识。
GWL_STYLE
获得窗口风格。
GWL_USERDATA
获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
GWL_WNDPROC
获得窗口过程的地址,或代表窗口过程的地址的句柄。
同样SetWindowLong也需要通过参数设定不同的信息;
以上就是关于C++中如何获取当前窗口句柄全部的内容,包括:C++中如何获取当前窗口句柄、如何通过句柄控制其它软件控件及 *** 作、vb中 如何获得窗体中所有控件的句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)