在keydown之前开一个线程
然后这里面去点击确定

解决方案 »

  1.   

    是API函数,不是系统命令发送消息。
    SendMessageA (窗口句柄, 16, 0, 0)
    网上找的 据说能解决
      

  2.   

    你要找到弹出窗口的hWnd,发一条WM_CLOSE消息过去,一般都可以把他关闭。你怕卡死在那可以用SendMessageTimeOut()去发
      

  3.   

    试试 这个
    SetMessage (int hWnd,int Msg, int wParam,int lParam )
     Msg 为2或16 可以关闭指定句柄窗口,
      

  4.   

    好像我用过这个我 的意思 是 不关闭 窗体 如果 关闭窗体 那我就 获取 不到 窗体上面 的button 按钮 的句柄了 啊,我 想实现 的 是 弹出 窗体 之后 我 执行 获取 button 按钮 句柄 的代码,现在是 窗体弹出 值后 程序 就 停留 在 SendMessage(intPtr, WM_KEYDOWN, 13, 0); 这个函数 里了,不继续 向下执行 ,有什么方法 让 窗体 弹出 之后 继续 向下 执行 函数
      

  5.   

    +1
    其实楼主犯难的不是如何关闭窗体,而是SendMessage(intPtr, WM_KEYDOWN, 13, 0);之后,代码卡在那里了(试过就知道了),所以开子线程可以有效解决这个问题。        private void SendEnterClick(IntPtr intPtr)
            {
                Thread thread = new Thread(CloseWin);
                thread.Start();            SendMessage(intPtr, WM_KEYDOWN, 13, 0);
                SendMessage(intPtr, WM_CHAR, 13, 0);
                SendMessage(intPtr, WM_KEYUP, 13, 0);
                GetHsCodeHandle();
                GetOkHandle();
                SendMessage(intPtrOk, WM_LBUTTONDOWN, 0, 20 + (5 << 16));
                SendMessage(intPtrOk, WM_LBUTTONUP, 0, 20 + (5 << 16));
            }        public const int WM_SYSCOMMAND = 0x0112;
            public const int SC_CLOSE = 0xF060; 
            private void CloseWin()
            {
                while(true)
                {
                    IntPtr intPtr = FindWindow(null, "弹出界面");
                    if (intPtr != IntPtr.Zero)
                    {
                        SendMessage(intPtr, WM_SYSCOMMAND, SC_CLOSE,0);
                        break;
                    }
                    Thread.Sleep(1000);
                }
            }
      

  6.   

    +1
    其实楼主犯难的不是如何关闭窗体,而是SendMessage(intPtr, WM_KEYDOWN, 13, 0);之后,代码卡在那里了(试过就知道了),所以开子线程可以有效解决这个问题。        private void SendEnterClick(IntPtr intPtr)
            {
                Thread thread = new Thread(CloseWin);
                thread.Start();            SendMessage(intPtr, WM_KEYDOWN, 13, 0);
                SendMessage(intPtr, WM_CHAR, 13, 0);
                SendMessage(intPtr, WM_KEYUP, 13, 0);
                GetHsCodeHandle();
                GetOkHandle();
                SendMessage(intPtrOk, WM_LBUTTONDOWN, 0, 20 + (5 << 16));
                SendMessage(intPtrOk, WM_LBUTTONUP, 0, 20 + (5 << 16));
            }        public const int WM_SYSCOMMAND = 0x0112;
            public const int SC_CLOSE = 0xF060; 
            private void CloseWin()
            {
                while(true)
                {
                    IntPtr intPtr = FindWindow(null, "弹出界面");
                    if (intPtr != IntPtr.Zero)
                    {
                        SendMessage(intPtr, WM_SYSCOMMAND, SC_CLOSE,0);
                        break;
                    }
                    Thread.Sleep(1000);
                }
            }
    问题是 我 的这些 代码 已经 是 在 一个线程 里了啊 ,不是 主线程 如果 子线程 中 在开 一个 线程 这样 合理吗
      

  7.   

    看了7楼才明白楼主的意思。修改一下
            private void SendEnterClick(IntPtr intPtr)
            {
                Thread thread = new Thread(CloseWin);
                thread.Start();
     
                SendMessage(intPtr, WM_KEYDOWN, 13, 0);
                
            }
     
            private void CloseWin()
            {
                while(true)
                {
                    IntPtr intPtr = FindWindow(null, "弹出界面");
                    if (intPtr != IntPtr.Zero)
                    {
                        SendMessage(intPtr, WM_CHAR, 13, 0);
                        SendMessage(intPtr, WM_KEYUP, 13, 0);
                        GetHsCodeHandle();
                        GetOkHandle();
                        SendMessage(intPtrOk, WM_LBUTTONDOWN, 0, 20 + (5 << 16));
                        SendMessage(intPtrOk, WM_LBUTTONUP, 0, 20 + (5 << 16));
                        break;
                    }
                    Thread.Sleep(1000);
                }
            }