工厂的UKEY生产流水线需要编号,外壳上的编号由激光打标机进行打标,由于编号和打标不在一起,容易造成UKEY内部编号与外壳编号不一致,需要两人工作,
如果打标机打标同时对UKEY进行编号,就解决了以上问题。由于激光打标机软件没有接口,厂家支持也跟不上,我就想到了编写VC软件来控制打标软件。具体步骤如下:
1、先在网上下载SPY++;
2、找到主窗口: HWND hWnd = ::FindWindow(NULL,m_strTitle);//m_strTitle是窗口标题
3、找到子窗口:HWND hWnd1 = ::FindWindowEx(hWnd,NULL,"AfxControlBar42","绘图");
在SPY++中找到所需子窗口的类和窗口标题
4、找到多个同类的子窗口(在一个父窗口下有多个无窗口标题的同类,需要第3个子窗口)
HWND hWnd5 = ::FindWindowEx(hWnd4,NULL,"#32770",""); //第一个子窗口
HWND hWnd6 = ::FindWindowEx(hWnd4,hWnd5,"#32770",""); //第二个子窗口
HWND hWnd7 = ::FindWindowEx(hWnd4,hWnd6,"#32770",""); //第三个子窗口
5、找到编辑框: HWND hEdit = ::GetDlgItem(hWnd7, 0x65C); //0x65C 是SPY++中此控件的ID
6、设置焦点:
::SendMessage( hWnd , WM_SETFOCUS , NULL , NULL );
::SendMessage( hEdit , WM_SETFOCUS , NULL , NULL );
7、给编辑框赋值
::SendMessage(hEdit,WM_SETTEXT,(WPARAM)255,(LPARAM)szText);Sleep(100);
8、给按钮发送“”点击消息“”
::SendMessage( hWndbtn , BM_CLICK , NULL , NULL );Sleep(100);
::SendMessage( hWndbtn2 , BM_CLICK , NULL , NULL );
一段例子:
void CTestDlg::OnOK()
{
// TODO: Add extra validation here
char szText[256];
//HWND hWnd = ::FindWindow(NULL,"HAN'S LASER Marking Software 5.3.3 - [skp]");
//if(hWnd) ::MessageBox(NULL,"find","tj",0);
HWND hWnd = ::FindWindow(NULL,"计算器");//m_strTitle=="计算器",在不同语言的系统上是不同的
/*HWND hEdit1 = ::GetDlgItem(hWnd, 0x193 );
::SendMessage( hEdit1 , WM_CHAR , '1' , 0 );
Sleep(500);
::SendMessage( hEdit1 , WM_CHAR , '2' , 0 );
return;
*/
HWND hEdit1 = ::GetDlgItem(hWnd, 125 );//按钮1的ID,可在SPY++中观察得到
HWND hEditMul = ::GetDlgItem(hWnd, 0x5B );//乘号的ID,可在SPY++中观察得到
HWND hEditEq = ::GetDlgItem(hWnd, 0x70 );//等号的ID,可在SPY++中观察得到
::SendMessage( hEdit1 , BM_CLICK , NULL , NULL );Sleep(500);
::SendMessage( hEdit1 , BM_CLICK , NULL , NULL );Sleep(500);
::SendMessage( hEdit1 , BM_CLICK , NULL , NULL );Sleep(500);
::SendMessage( hEditMul , BM_CLICK , NULL , NULL );Sleep(500);
::SendMessage( hEdit1 , BM_CLICK , NULL , NULL );Sleep(500);
::SendMessage( hEdit1 , BM_CLICK , NULL , NULL );Sleep(500);
::SendMessage( hEdit1 , BM_CLICK , NULL , NULL );Sleep(1000);
::SendMessage( hEditEq , BM_CLICK , NULL , NULL );Sleep(500);
HWND hEdit = ::GetDlgItem(hWnd, 0x193 );
::SendMessage(hEdit,WM_GETTEXT,(WPARAM)256,(LPARAM)szText);
strcpy(szText, "12345678");
::SendMessage(hEdit,WM_SETTEXT,(WPARAM)256,(LPARAM)szText);
::MessageBox(NULL,szText,"tj",0);
}