要录入点数据,用了句柄,可一执行就假死

jdczp 2016-09-20 10:48:08
事情是这样的,一个程序不能导入,只能手工录,于是就用了句柄,录入界面有两三个界面,单个界面我都弄好了,但是界面与界面跳转就假死了,实在不知道是什么原因了。

比如,录一些数据,就点确定,然后就弹出确定对话框,这是我的程序就假死了,也不继续执行点这个按扭了。

望大侠帮忙
...全文
176 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2016-09-21
  • 打赏
  • 举报
回复
具体的代码是什么,postmessage的么
  • 打赏
  • 举报
回复
SendMessage(hWnd1, WM_LBUTTONUP, (IntPtr)0, null); SendMessage会等待消息处理,所以会阻塞,导致你的程序假死 如果直接用PostMessage,你的程序不会假死了,但是对方可能还没来得及弹出窗 IntPtr hWnd7 = FindWindow(null, "提示");就找不到了,这里需要一个类似“自旋锁”的机制去找提示对方框的句柄 比如
PostMessage(hWnd1, WM_LBUTTONUP, (IntPtr)0, null);
IntPtr hWnd7 = IntPtr.Zero;
for(int i = 0; hWnd7== IntPtr.Zero && i< 10; i++)
{
      Thread.Sleep(200);
       hWnd7 = FindWindow(null, "提示");
}
或者用
IntPtr lpdwResult;
//等等消息处理或超时2秒
var result = SendMessageTimeout(hWnd1, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero,
0x0001 | 0x0002,    //SMTO_BLOCK(等待返回) | SMTO_ABORTIFHUNG (若目标窗口无响应则立即返回)
2000,
out lpdwResult;)
if(result != 0)
{
      IntPtr hWnd7 = FindWindow(null, "提示");
}

[DllImport("user32.dll", SetLastError = true)]                                                //发送消息后直到目标窗口处理完成或者超时后返回
public static extern int SendMessageTimeout(IntPtr hWnd, uint WM_CHAR, IntPtr wParam, IntPtr lParam, uint fuFlags, int uTimeout, out IntPtr lpdwResult);
  • 打赏
  • 举报
回复
SendMessage(hWnd1, WM_LBUTTONDOWN, (IntPtr)0, null); Thread.Sleep(1000); SendMessage(hWnd1, WM_LBUTTONUP, (IntPtr)0, null);
  • 打赏
  • 举报
回复
还有就是要确认下你的查找、提示句柄和sendmessage都是正确的!
  • 打赏
  • 举报
回复
引用 3 楼 jdczp 的回复:
IntPtr hWnd1 = FindWindowEx(hWnd, IntPtr.Zero, null, "查找"); SendMessage(hWnd1, WM_LBUTTONDOWN, (IntPtr)0, null); SendMessage(hWnd1, WM_LBUTTONUP, (IntPtr)0, null); 运行到这里提示对话框弹出来,我自己的程序就假死了 这时可以自己手动点是自己的程序又可以继续 IntPtr hWnd7 = FindWindow(null, "提示"); IntPtr hWnd8 = FindWindowEx(hWnd7, IntPtr.Zero, null, "是(&Y)"); SendMessage(hWnd8, WM_LBUTTONDOWN, (IntPtr)0, null); SendMessage(hWnd8, WM_LBUTTONUP, (IntPtr)0, null);
上下执行之间没有时间间隔,而程序是不会等你出现“提示”对话框再执行的,建议你在timer里执行:
private void button1_Click(object sender, EventArgs e)
        {
            //这里添加你执行弹出对话框的代码
            //×××××××

            time1.Start();//抓取句柄
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
			IntPtr hWnd=FindWindow(null,"***");//你的句柄?
			if(hWnd!=IntPtr.Zero)
			{
			    IntPtr hWnd1 = FindWindowEx(hWnd, IntPtr.Zero, null, "查找");
                SendMessage(hWnd1, WM_LBUTTONDOWN, (IntPtr)0, null);
                SendMessage(hWnd1, WM_LBUTTONUP, (IntPtr)0, null);
			}

            IntPtr hWnd7 = FindWindow(null, "提示");
            if (hWnd7!=IntPtr.Zero)
            {
                IntPtr hWnd8 = FindWindowEx(hWnd7, IntPtr.Zero, null, "是(&Y)");
                SendMessage(hWnd8, WM_LBUTTONDOWN, (IntPtr)0, null);
                SendMessage(hWnd8, WM_LBUTTONUP, (IntPtr)0, null);
                timer1.Stop();
            }
		}
jdczp 2016-09-21
  • 打赏
  • 举报
回复
IntPtr hWnd1 = FindWindowEx(hWnd, IntPtr.Zero, null, "查找"); SendMessage(hWnd1, WM_LBUTTONDOWN, (IntPtr)0, null); SendMessage(hWnd1, WM_LBUTTONUP, (IntPtr)0, null); 运行到这里提示对话框弹出来,我自己的程序就假死了 这时可以自己手动点是自己的程序又可以继续 IntPtr hWnd7 = FindWindow(null, "提示"); IntPtr hWnd8 = FindWindowEx(hWnd7, IntPtr.Zero, null, "是(&Y)"); SendMessage(hWnd8, WM_LBUTTONDOWN, (IntPtr)0, null); SendMessage(hWnd8, WM_LBUTTONUP, (IntPtr)0, null);
Justin-Liu 2016-09-21
  • 打赏
  • 举报
回复
处理的数据多吗?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧