C++中如何获取当前窗口句柄

C++中如何获取当前窗口句柄,第1张

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中 如何获得窗体中所有控件的句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10174164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存