1. 程式人生 > >[windows程式設計] 如何利用控制代碼操作其他windows窗體(1)

[windows程式設計] 如何利用控制代碼操作其他windows窗體(1)

如何利用控制代碼操作其他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 )

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大問題就完全解決了。