首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

上面这段代码,调试通过了,运行就出错!大姐帮忙看看什么有关问题

2012-09-11 
下面这段代码,调试通过了,运行就出错!各位大哥大姐帮忙看看什么问题!这段代码是实现自动启动Windows自带的

下面这段代码,调试通过了,运行就出错!各位大哥大姐帮忙看看什么问题!
这段代码是实现自动启动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??

热点排行