读书人

上面这段代码调试通过了运行就出错

发布时间: 2012-09-11 10:49:03 作者: rapoo

下面这段代码,调试通过了,运行就出错!各位大哥大姐帮忙看看什么问题!
这段代码是实现自动启动Windows自带的计算器,然后点击其中一个按钮的功能!
调试的时候没问题,全速运行的时候就只能启动,不能进行点击按钮的操作!
按理说如果没找到“计算器”的句柄,那个循环会一直执行,找到了就会执行sendMessage的操作!

C/C++ code
    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);


[解决办法]
C/C++ code
    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??

读书人网 >VC/MFC

热点推荐