|
本帖最后由 kingxy 于 2021-12-1 18:00 编辑
感谢 cpp2019和oyxbl对我的帮助!
加上线程同步Event就解决了!
目的:创建了个对话框程序,界面上一个编辑框和一个按钮,本想在编辑框中填写某窗口标题名,然后点按钮通过标题名获取该窗口句柄,接着创建新线程,向该窗口发送按键并延时,反复几次。
代码:
struct sb_struct //声明一个结构
{
HWND sb_Hwnd;//用来存放窗口句柄
};
UINT _cdecl Threadproc(LPVOID lpParameter)
{
sb_struct *sb_structTemp1 = (sb_struct *)lpParameter;//传递
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 49, 0);//有执行 按键1
Sleep(5000);
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 50, 0);//没有执行 按键2
Sleep(5000);
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 51, 0);//没有执行 按键3
Sleep(5000);
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 52, 0);//没有执行 按键4
Sleep(5000);
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 53, 0);//没有执行 按键5
Sleep(8000);
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 54, 0);//没有执行 按键6
Sleep(8000);
::SendMessage(sb_structTemp1->sb_Hwnd, WM_KEYDOWN, 55, 0);//没有执行 按键7
AfxMessageBox(_T("次线程,运行到这里!")); //有弹出 提示窗1
return 0;
}
void CBUFFRobotDlg::OnBnClickedGo()
{
// TODO: 在此添加控件通知处理程序代码
CString sbEdit_String;//预定义字符串变量,用于存放编辑框内容
GetDlgItemText(IDC_EDIT1, sbEdit_String);//获取编辑框中的内容
if (sbEdit_String == "")//检测编辑框是否为空
{
MessageBox(_T("编辑框不能为空!"));
}
else
{
HWND sbWindow_HWND;//预声明窗口句柄
sbWindow_HWND = ::FindWindow(NULL, sb_Edit_String);//获取窗口句柄
if (sbWindow_HWND != NULL)//如果找到了目标窗口句柄
{
sb_struct sb_Struct_temp2; //声明结构,存放窗口句柄
sb_Struct_temp2.sb_Hwnd = sbWindow_HWND;//给结构变量赋值上面获取的窗口句柄
CWinThread *sb_Thread = AfxBeginThread(Threadproc, &sb_Struct_temp2);//创建线程
//MessageBox(_T("按钮事件,运行到这里!"));//有弹出 提示窗2
}
else
{
MessageBox(_T("没有发现目标窗口"));
}
}
}
现象:当注释掉“提示窗2”时,目标窗口只有第一个按键产生效果,并且“提示窗1”有弹出,估算时间应该所有sleep函数有生效;当不注释掉“提示窗2”时,运行程序,在点掉弹出的“提示窗2”前,目标窗口有7个按键的效果,一旦点掉“提示窗2”后续的发送按键也像不执行了一样没效果,但是还有有“提示窗1”弹出;这个是哪里的问题啊?
因为 AfxBeginThread 后边的 MessageBox 会阻塞,所以线程有足够的时间执行线程中的语句,
MessageBox 关闭后 OnBnClickedGo() 的生命周期结束,线程中没执行的语句也就不会执行,
注释掉 AfxBeginThread 后边的 MessageBox 同理。
原因已经告诉你了,解决办法不难,自行解决。
|
上一篇: 为什么这个程序运行只能得到一个水仙花数,应该得到四个的呀下一篇: socket如何传输鼠标的状态信息?
|