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

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

2012-08-04 19:45 381 查看
如何利用句柄操作其他windows窗体?

首先你需要获得需要操作窗体(A)的句柄。

第二需要你获得窗体(A)中控件的ID号,比如文本框(Edit)控件的ID

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

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

明白了上述任务之后,那么下面的就是具体如何操作了。

第一:获得窗体的句柄

分为两种情况,窗体有标题和窗体没有标题

有标题的窗体很简单使用window API中的FindWindow就很容易找到。HWnd hwnd = ::FindWindow(NULL,"窗体的标题名字");

如果窗体没有标题,只知道窗体的类名那么也可以使用FindWindow。HWnd hwnd = ::FindWindow("窗体的类名",NULL);

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

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

// 枚举已经打开的窗体,回调函数
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);


到此文章开始前的4大问题就完全解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐