下面这段代码,调试通过了,运行就出错!各位大哥大姐帮忙看看什么问题!
这段代码是实现自动启动Windows自带的计算器,然后点击其中一个按钮的功能!
调试的时候没问题,全速运行的时候就只能启动,不能进行点击按钮的操作!
按理说如果没找到“计算器”的句柄,那个循环会一直执行,找到了就会执行sendMessage的操作!
PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo ; ZeroMemory(&ProcessInfo, sizeof(ProcessInfo)); CreateProcess(NULL,"C:\\WINDOWS\\system32\\calc.exe", NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo); HWND hWnd = NULL; do { hWnd = FindWindow(NULL, _T("计算器"))->GetSafeHwnd(); if(hWnd) { HWND hBtn1 = FindWindowEx(hWnd,NULL,_T("Button"),_T("7")); DWORD nId = ::GetDlgCtrlID(hBtn1); ::SendMessage( hWnd,WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hBtn1); } } while (NULL == hWnd); WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo ; ZeroMemory(&ProcessInfo, sizeof(ProcessInfo)); CreateProcess(NULL,"C:\\WINDOWS\\system32\\calc.exe", NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo); HWND hWnd = NULL; do { hWnd = FindWindow(NULL, _T("计算器"))->GetSafeHwnd(); if(hWnd) { HWND hBtn1 = FindWindowEx(hWnd,NULL,_T("Button"),_T("7")); DWORD nId = ::GetDlgCtrlID(hBtn1); ::SendMessage( hWnd,WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hBtn1); } } while (NULL == hWnd); if (hWnd) { HWND hBtn1 = FindWindowEx(hWnd,NULL,_T("Button"),_T("7")); DWORD nId = ::GetDlgCtrlID(hBtn1); ::SendMessage( hWnd,WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hBtn1); } WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread);
[解决办法]
HWND hWnd = NULL;
do
{
hWnd = FindWindow(NULL, _T("计算器"))->GetSafeHwnd();
if(hWnd)
{
HWND hBtn1 = NULL;
do
{
hBtn1 = FindWindowEx(hWnd,NULL,_T("Button"),_T("7"));
DWORD nId = ::GetDlgCtrlID(hBtn1);
::SendMessage( hWnd,WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hBtn1);
} while (NULL == hBtn1);
}
} while (NULL == hWnd);
那个计算器程序出来了,可按钮没那么快出来吧,再while
[解决办法]
calc的主窗口出来了,但其子窗口还未初始化完毕。
建议在createprocess后sleep(2000),以确定是不是子窗口还没初始化完成。
[解决办法]
'找不到那个窗口'
WaitInputIdle(hprec,INFINT)// waitfor??