C# 仅当窗体处于隐藏状态时才显示弹出窗口

C# 仅当窗体处于隐藏状态时才显示弹出窗口,c#,.net,winforms,sockets,console-application,C#,.net,Winforms,Sockets,Console Application,基本上,我正在开发的程序是一个C#控制台应用程序,它通过套接字监听请求。一旦建立连接,它将调用并显示名为frmPdfViewer的Windows窗体 在frmPdfViewer中,有一个名为符号的ToolStripMenuItem。单击时,应显示一个供用户签名的签名弹出窗口 现在我的问题是,当我单击签名ToolStripMenuItem时,表单冻结并且不显示签名弹出窗口。没有抛出错误或异常,它只是冻结。但是,当我在单击签名后尝试隐藏frmPdfViewer时,签名弹出窗口出现 为什么会有这样的行

基本上,我正在开发的程序是一个C#控制台应用程序,它通过套接字监听请求。一旦建立连接,它将调用并显示名为frmPdfViewer的Windows窗体

frmPdfViewer中,有一个名为符号的ToolStripMenuItem。单击时,应显示一个供用户签名的签名弹出窗口

现在我的问题是,当我单击签名ToolStripMenuItem时,表单冻结并且不显示签名弹出窗口。没有抛出错误或异常,它只是冻结。但是,当我在单击签名后尝试隐藏frmPdfViewer时,签名弹出窗口出现

为什么会有这样的行为?

下面是套接字代码的片段(在ProcReq()中方法是调用表单的地方):

以下是ProcReq方法的代码段(将在此处调用表单):

以下是frmPdfViewer中sign click事件的代码段:

注意:我正在使用名为Wacom Signature SDK的第三方SDK,只能查看其方法的接口,而不能查看其实现。显示签名弹出窗口的方法是捕获()


注意:当我在Capture()方法之前放置断点,然后继续运行程序时,签名弹出窗口也会出现。

您可以在显示表单后尝试添加
formvariable.BringToFront()

在方法上设置断点,并在断点中断后使用Debug>Windows>Threads。Crystal ball说,您可以看到代码在工作线程上运行,而不是在主线程上运行。很多很多问题,Z顺序问题和冻结外观只是其中的一小部分。使用BeginInvoke确保在UI线程上创建表单。您可以在
ShowDialog()
@HansPassant I-see中以所有者身份传递当前表单。我创建了一个名为CaptureSignature()的新方法,并将sign click事件代码移到了那里。之后,我放置了
Invoke(newmethodinvoker(CaptureSignature))
在sign click事件中,但它仍然不起作用。我以前没有真正使用过Invoke(),所以您能告诉我在这种情况下如何正确使用它吗?您需要使用在主线程上创建的表单的BeginInvoke()方法。通常是您的主窗口。如果您迫切需要获得正确的对象引用,则Application.OpenForms[0].BeginInvoke(…)会有所帮助。@HansPassant我的主窗口是控制台应用程序。那么,您是说我应该在显示表单(即pdfViewer.ShowDialog();)后使用该代码?
        var wsURI = ConfigurationManager.AppSettings["wsURI"];
        var id = ConfigurationManager.AppSettings["id"];
        var ns = ConfigurationManager.AppSettings["namespace"];
        var type = ConfigurationManager.AppSettings["type"];

        var socket = IO.Socket(wsURI + "/" + ns);

        socket.On(Socket.EVENT_CONNECT, () =>
        {
            // Construct Push Message for Device Registration
            JObject reg = MessageFactory.CreateRegistrationMessage(id,
            "RR_" + id, type);

            socket.Emit("peripheral/registration", JsonConvert.SerializeObject(reg));

            socket.On(ns + "/RR_" + id, (reqMsg) =>
            {
                JObject req = reqMsg as JObject;
                JObject reqHeader = (JObject)req["header"];

                RespPayload respPayload = TabletTerminal.GetInstance().ProcReq(req);

                JObject resp = new JObject();
                resp.Add("header", reqHeader);
                resp.Add("payload", JObject.FromObject(respPayload));

                var jsonResp = JsonConvert.SerializeObject(resp);

                socket.Emit(ns + "/RR_" + id, jsonResp);
            });
        })
public SignatureRespPayload ProcReq(JObject req)
        {
            SignatureRespPayload signatureRespPayload = new SignatureRespPayload();

            JObject reqPayload = req.GetValue("payload") as JObject;
            string name = (string)reqPayload["name"];
            string reason = (string)reqPayload["reason"];
            string pdfPath = (string)reqPayload["pdfPath"];

            frmPdfViewer pdfViewer = new frmPdfViewer(name, reason, pdfPath);
            pdfViewer.ShowDialog();
            signatureRespPayload.returnValue = pdfViewer.returnValue;

            if (signatureRespPayload.returnValue)
            {
                signatureRespPayload.signedPdfPath = pdfViewer.signedPdfPath;
            }
            else
            {
                signatureRespPayload.errorMessage = pdfViewer.errorMessage;
            }

            pdfViewer.Dispose();
            return signatureRespPayload;
        }
try
        {
            SigCtl sigCtl = new SigCtl();
            sigCtl.Licence = Properties.Settings.Default.License;
            DynamicCapture dc = new DynamicCaptureClass();
            DynamicCaptureResult res = dc.Capture(sigCtl, name, reason, null, null);

            if (res == DynamicCaptureResult.DynCaptOK)
            {
                SigObj sigObj = (SigObj)sigCtl.Signature;
                String filename = System.IO.Path.GetTempFileName();
                sigObj.RenderBitmap(filename, 400, 200, "image/png", 0.5f, 0xff0000, 0xffffff, 10.0f, 10.0f, RBFlags.RenderOutputFilename | RBFlags.RenderColor32BPP | RBFlags.RenderEncodeData | RBFlags.RenderBackgroundTransparent);
                string newFile = InsertSignatureImageToPdf(filename);
                loadPdf(newFile, false);
            }
        }
        catch (Exception ex)
        {
            Console.Write(ex.StackTrace);
            MessageBox.Show(ex.Message);
        }