[windows编程] 如何利用句柄操作其他windows窗体(1)

操作系统 专栏收录该内容
1 篇文章 0 订阅

转自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);

        如果窗体没有标题,也不知道类名。但窗体中的按钮或者文本可以明显看到,也是可以找到窗体的句柄的。可以使用函数EnumWindowsEnumWindowsProc

 假设窗体没有标题,也不知道该窗体的类名,但知道窗体中有一个“登陆"按钮的名字。具体操作如下:

[cpp]  view plain  copy
 print ?
  1. // 枚举已经打开的窗体,回调函数  
  2. BOOL CALLBACK    EnumWindowsProc(HWND hWnd,LPARAM lParam)  
  3. {  
  4.     if(::IsWindowVisible(hWnd))  
  5.     {  
  6.         wchar_t WindowTitle[100]={0};      
  7.         /*::GetWindowText(hWnd,WindowTitle,100); 
  8.         ::MessageBox(NULL,WindowTitle,NULL,MB_OK); */  
  9.   
  10.         ::GetWindowText(hWnd,WindowTitle,100);  
  11.         CString str1=WindowTitle;  
  12.         UINT  a=0;  
  13.         if(str1=="")   
  14.         {  
  15.             a = ::GetDlgItemText(hWnd,1,WindowTitle,100);  
  16.             CString str=WindowTitle;  
  17.             if(str == _T("登录"))  
  18.             {  
  19.                 ((CAutoLoginDlg*)lParam)->dhwnd = hWnd;  
  20.                 return FALSE;  
  21.             }  
  22.         }  
  23.         return a==0;  
  24.     }  
  25.   
  26.     return TRUE;  
  27. }  


调用方式:

[cpp]  view plain  copy
 print ?
  1. HWND hWnd =NULL;  
  2. EnumWindows(&EnumWindowsProc  ,(LPARAM)this );   
  3. hWnd = this->dhwnd;  
OK 至此您已经获得窗体A的操作句柄hwnd了。

第二:第二需要你获得窗体(A)中控件的ID号,比如按钮控件的ID

第一种方法很见简单:使用UISPY软件,获取窗体A中任何一个控件的ID

第二种方法相对复杂:需要使用自己进行查询和判断,下面贴上我的方法

[cpp]  view plain  copy
 print ?
  1. // 获取某一个窗体中的控件,并添加到ListView中  
  2. void  CAutoLoginDlg::GetInstance(int id)  
  3. {  
  4.     HWND hWnd=NULL;  
  5.     CString str(_T(""));  
  6.     hWnd = ::GetDlgItem(dhwnd,id);  
  7.   
  8.     if(hWnd==NULL)  
  9.         return;    
  10.   
  11.     WCHAR result[25];  
  12.     WCHAR szClassName[MAX_PATH];  
  13.     ::GetClassName(hWnd, szClassName, MAX_PATH);  
  14.     if (( wcscmp(szClassName, _T("Button"))) == 0 )  
  15.     {  
  16.         str="Button";  
  17.     }  
  18.     if (( wcscmp(szClassName, _T("Edit"))) == 0 )  
  19.     {  
  20.         str="Edit";  
  21.     }  
  22.     if (( wcscmp(szClassName, _T("ComboBox"))) == 0 )  
  23.     {   
  24.         str="Combobox";    
  25.     }  
  26.   
  27.     int item =m_lList.InsertItem(0,_T(""));   
  28.     m_lList.SetItemText(item,0, (LPCTSTR) str);  
  29.     CString temp;  
  30.     temp.Format(_T("%d"),id);  
  31.     m_lList.SetItemText(item,1,(LPCTSTR)temp);  
  32.     temp.Format(_T("%ld"),hWnd);  
  33.     m_lList.SetItemText(item,2, (LPCTSTR)temp );  
  34.     ::GetWindowText(hWnd,result,25);  
  35.     m_lList.SetItemText(item,3,result);  
  36.   
  37.     OnUpdateUI(FALSE);  
  38. }  
你需要使用上述方法进行轮询的方法进行查询并获取各种控件的ID,句柄,和显示文字。

第三:需要根据控件的ID获得控件的句柄(HWND )

需要使用的方法GetDlgItem

[cpp]  view plain  copy
 print ?
  1. HWND pLoginWnd =::GetDlgItem(hwnd,loginID);  

第四根据hwnd对控件进行操作

1.修改文本使用函数SetWindowText,比如修改第三步按钮显示的文字

[cpp]  view plain  copy
 print ?
  1. HWND pLoginWnd =::GetDlgItem(hwnd,loginID);   
  2. CString str=_T("登录中");  
  3. ::SetWindowText(pLoginWnd,str)  
2.发送按钮的单击事件

[cpp]  view plain  copy
 print ?
  1. :: PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(loginID, BN_CLICKED), (LPARAM)pLoginWnd);  


到此文章开始前的4大问题就完全解决了。
  • 1
    点赞
  • 1
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值