[windows编程] 如何利用句柄操作其他windows窗体(1)
来源:互联网 发布:c语言socket文件传输 编辑:程序博客网 时间:2024/05/27 06:51
如何利用句柄操作其他windows窗体?
首先你需要获得需要操作窗体(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了。
第二:第二需要你获得窗体(A)中控件的ID号,比如按钮控件的ID
第一种方法很见简单:使用UISPY软件,获取窗体A中任何一个控件的ID
第二种方法相对复杂:需要使用自己进行查询和判断,下面贴上我的方法
// 获取某一个窗体中的控件,并添加到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
HWND pLoginWnd =::GetDlgItem(hwnd,loginID);
第四根据hwnd对控件进行操作
1.修改文本使用函数SetWindowText,比如修改第三步按钮显示的文字
HWND pLoginWnd =::GetDlgItem(hwnd,loginID); CString str=_T("登录中");::SetWindowText(pLoginWnd,str)2.发送按钮的单击事件
:: PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(loginID, BN_CLICKED), (LPARAM)pLoginWnd);
- [windows编程] 如何利用句柄操作其他windows窗体(1)
- [windows编程] 如何利用句柄操作其他windows窗体(1)
- [windows编程] 如何利用句柄操作其他windows窗体
- Windows编程---句柄
- windows编程 句柄是什么
- Windows核心编程笔记(1)----句柄
- windows编程(1)-句柄,内核对象
- Windows核心编程---句柄和伪句柄
- windows核心编程-进程的句柄和如何获得
- Windows编程C++之句柄
- windows编程学习之句柄
- Windows编程基础--第18节 MFC之窗体操作
- Windows窗体设计 添加其他窗口
- 如何:操作 Windows 窗体 DataGridView 控件中的列
- windows 句柄
- windows句柄
- Windows句柄
- Windows 句柄
- Oracle中数据导出成CVS,EXCEL
- 请用Shell编程来实现:当输入不同的选择时,执行不同的操作,如:输入start 开始启动应用程序myfiles,输入stop时,关闭myfiles,输入status时,查看myfiles进程,否则执
- 函数返回值作为左值问题
- Unexpected error while launching logcat. Try reselecting the device.
- 面向对象设计与分析
- [windows编程] 如何利用句柄操作其他windows窗体(1)
- UIAlertView demo
- “面向对象”和“基于对象”
- 无规矩不成方圆——SQL Server 约束
- Android NFC 开发实例
- 字符从键盘输入到在显示器显示出来的详细过程
- 如何解决Mysql中的乱码问题
- 哥来了
- 数据库学习总结——轻松走进数据库系列之十四