您的位置:首页 > 编程语言

[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);

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

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

[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
相关文章推荐