[windows编程] 如何利用句柄操作其他windows窗体(1)
2017-04-10 09:56
471 查看
转自http://blog.csdn.net/wziyx513225244/article/details/7830704
如何利用句柄操作其他windows窗体?
首先你需要获得需要操作窗体(A)的句柄。
第二需要你获得窗体(A)中控件的ID号,比如文本框(Edit)控件的ID
第三需要根据控件的ID获得控件的句柄(hwnd)
第四根据hwnd对控件进行操作
明白了上述任务之后,那么下面的就是具体如何操作了。
第一:获得窗体的句柄
分为两种情况,窗体有标题和窗体没有标题
有标题的窗体很简单使用window API中的FindWindow就很容易找到。HWnd hwnd = ::FindWindow(NULL,"窗体的标题名字");
如果窗体没有标题,只知道窗体的类名那么也可以使用FindWindow。HWnd hwnd = ::FindWindow("窗体的类名",NULL);
如果窗体没有标题,也不知道类名。但窗体中的按钮或者文本可以明显看到,也是可以找到窗体的句柄的。可以使用函数EnumWindows和EnumWindowsProc
假设窗体没有标题,也不知道该窗体的类名,但知道窗体中有一个“登陆"按钮的名字。具体操作如下:
[cpp] view
plain copy
print?
// 枚举已经打开的窗体,回调函数
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;
}
调用方式:
[cpp] view
plain copy
print?
HWND hWnd =NULL;
EnumWindows(&EnumWindowsProc ,(LPARAM)this );
hWnd = this->dhwnd;
OK 至此您已经获得窗体A的操作句柄hwnd了。
第二:第二需要你获得窗体(A)中控件的ID号,比如按钮控件的ID
第一种方法很见简单:使用UISPY软件,获取窗体A中任何一个控件的ID
第二种方法相对复杂:需要使用自己进行查询和判断,下面贴上我的方法
[cpp] view
plain copy
print?
// 获取某一个窗体中的控件,并添加到ListView中
void CAutoLoginDlg::GetInstance(int id)
{
HWND hWnd=NULL;
CString str(_T(""));
hWnd = ::GetDlgItem(dhwnd,id);
if(hWnd==NULL)
return;
WCHAR result[25];
WCHAR szClassName[MAX_PATH];
::GetClassName(hWnd, szClassName, MAX_PATH);
if (( wcscmp(szClassName, _T("Button"))) == 0 )
{
str="Button";
}
if (( wcscmp(szClassName, _T("Edit"))) == 0 )
{
str="Edit";
}
if (( wcscmp(szClassName, _T("ComboBox"))) == 0 )
{
str="Combobox";
}
int item =m_lList.InsertItem(0,_T(""));
m_lList.SetItemText(item,0, (LPCTSTR) str);
CString temp;
temp.Format(_T("%d"),id);
m_lList.SetItemText(item,1,(LPCTSTR)temp);
temp.Format(_T("%ld"),hWnd);
m_lList.SetItemText(item,2, (LPCTSTR)temp );
::GetWindowText(hWnd,result,25);
m_lList.SetItemText(item,3,result);
OnUpdateUI(FALSE);
}
你需要使用上述方法进行轮询的方法进行查询并获取各种控件的ID,句柄,和显示文字。
第三:需要根据控件的ID获得控件的句柄(HWND )
需要使用的方法GetDlgItem
[cpp] view
plain copy
print?
HWND pLoginWnd =::GetDlgItem(hwnd,loginID);
第四根据hwnd对控件进行操作
1.修改文本使用函数SetWindowText,比如修改第三步按钮显示的文字
[cpp] view
plain copy
print?
HWND pLoginWnd =::GetDlgItem(hwnd,loginID);
CString str=_T("登录中");
::SetWindowText(pLoginWnd,str)
2.发送按钮的单击事件
[cpp] view
plain copy
print?
:: PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(loginID, BN_CLICKED), (LPARAM)pLoginWnd);
到此文章开始前的4大问题就完全解决了。
如何利用句柄操作其他windows窗体?
首先你需要获得需要操作窗体(A)的句柄。
第二需要你获得窗体(A)中控件的ID号,比如文本框(Edit)控件的ID
第三需要根据控件的ID获得控件的句柄(hwnd)
第四根据hwnd对控件进行操作
明白了上述任务之后,那么下面的就是具体如何操作了。
第一:获得窗体的句柄
分为两种情况,窗体有标题和窗体没有标题
有标题的窗体很简单使用window API中的FindWindow就很容易找到。HWnd hwnd = ::FindWindow(NULL,"窗体的标题名字");
如果窗体没有标题,只知道窗体的类名那么也可以使用FindWindow。HWnd hwnd = ::FindWindow("窗体的类名",NULL);
如果窗体没有标题,也不知道类名。但窗体中的按钮或者文本可以明显看到,也是可以找到窗体的句柄的。可以使用函数EnumWindows和EnumWindowsProc
假设窗体没有标题,也不知道该窗体的类名,但知道窗体中有一个“登陆"按钮的名字。具体操作如下:
[cpp] view
plain copy
print?
// 枚举已经打开的窗体,回调函数
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;
}
调用方式:
[cpp] view
plain copy
print?
HWND hWnd =NULL;
EnumWindows(&EnumWindowsProc ,(LPARAM)this );
hWnd = this->dhwnd;
OK 至此您已经获得窗体A的操作句柄hwnd了。
第二:第二需要你获得窗体(A)中控件的ID号,比如按钮控件的ID
第一种方法很见简单:使用UISPY软件,获取窗体A中任何一个控件的ID
第二种方法相对复杂:需要使用自己进行查询和判断,下面贴上我的方法
[cpp] view
plain copy
print?
// 获取某一个窗体中的控件,并添加到ListView中
void CAutoLoginDlg::GetInstance(int id)
{
HWND hWnd=NULL;
CString str(_T(""));
hWnd = ::GetDlgItem(dhwnd,id);
if(hWnd==NULL)
return;
WCHAR result[25];
WCHAR szClassName[MAX_PATH];
::GetClassName(hWnd, szClassName, MAX_PATH);
if (( wcscmp(szClassName, _T("Button"))) == 0 )
{
str="Button";
}
if (( wcscmp(szClassName, _T("Edit"))) == 0 )
{
str="Edit";
}
if (( wcscmp(szClassName, _T("ComboBox"))) == 0 )
{
str="Combobox";
}
int item =m_lList.InsertItem(0,_T(""));
m_lList.SetItemText(item,0, (LPCTSTR) str);
CString temp;
temp.Format(_T("%d"),id);
m_lList.SetItemText(item,1,(LPCTSTR)temp);
temp.Format(_T("%ld"),hWnd);
m_lList.SetItemText(item,2, (LPCTSTR)temp );
::GetWindowText(hWnd,result,25);
m_lList.SetItemText(item,3,result);
OnUpdateUI(FALSE);
}
你需要使用上述方法进行轮询的方法进行查询并获取各种控件的ID,句柄,和显示文字。
第三:需要根据控件的ID获得控件的句柄(HWND )
需要使用的方法GetDlgItem
[cpp] view
plain copy
print?
HWND pLoginWnd =::GetDlgItem(hwnd,loginID);
第四根据hwnd对控件进行操作
1.修改文本使用函数SetWindowText,比如修改第三步按钮显示的文字
[cpp] view
plain copy
print?
HWND pLoginWnd =::GetDlgItem(hwnd,loginID);
CString str=_T("登录中");
::SetWindowText(pLoginWnd,str)
2.发送按钮的单击事件
[cpp] view
plain copy
print?
:: PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(loginID, BN_CLICKED), (LPARAM)pLoginWnd);
到此文章开始前的4大问题就完全解决了。
相关文章推荐
- [windows编程] 如何利用句柄操作其他windows窗体(1)
- [windows编程] 如何利用句柄操作其他windows窗体
- 如何使窗体 Showmodal 后可以操作其他窗体
- 如何利用Python和win32编程避免重复性体力劳动(四)——下拉列表操作:CB_SETCURSEL、CBN_SELENDOK和CBN_SELCHANGE
- 关于如何操作其他窗体的控件或变量的方法!
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- 如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT
- DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)
- 关于如何操作其他窗体的控件或变量的方法
- 如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT
- 如何:使用 Windows 窗体 TextBox 控件创建密码文本框 .NET Framework 2.0 其他版本 密码框是一种 Windows 窗体文本框,它在用户键入字符串时显示占位符。 创
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- [Mac OS X Cocoa编程]如何获取其他应用程序的窗体标题以及相关信息?
- access 如何编程打开其他数据库中的窗体?
- 如何:操作 Windows 窗体 DataGridView 控件中的列
- 如何利用Python和win32编程避免重复性体力劳动(四)——下拉列表操作:CB_SETCURSEL、CBN_SELENDOK和CBN_SELCHANGE
- Windows 窗体编程 如何:使用后台线程搜索文件 (线程经典例子)
- 如何在子线程中操作窗体上的控件
- 如何把Windows 窗体 DataGridView 的某一列的数据显示为“*”
- 问题:如何在win窗体中更改其他win窗体控件的属性?