反正是有陷阱,或通过互操作调用的DLL函数时杀了一个弹出窗口?

我写它要求使用非托管代码编写的DLL中的函数的C#应用​​程序。

在大多数情况下,调用做工精细和被调用函数返回一个整数值,指定无论成功或错误代码的屈指可数。 然而,一对夫妇的错误代码,该DLL也似乎弹出一个消息框,提供有关错误的一些详细信息。

我不知道,如果这是将要发生一个给定的功能可按来电或不来,宁可不费尽口舌这些消息框的用户,因为有时我在一个批处理过程调用此函数上千次,我宁愿没有用户必须按“OK”然而,对于许多失败有碰巧。

如果有什么办法要么确定一个消息框是一个给定的电话后表示,或者一般禁用或禁止特定通话过程中显示的任何窗口或表格? 这似乎不太可能,但我认为我会问无论如何。

谢谢你,先生中号

--------------解决方案-------------

当你怀疑,你不会是能够抑制从代码中你没有写,除非有来电,将为你做的特定参数的弹出窗口。 与特定错误代码相关联的消息框?

有可用的程序,将监视计算机对特定的窗口,然后点击按钮,它们出现的时候,他们,尽管当然要求用户运行也有点负担。 [编辑:乔指出,你可以自己做一个单独的线程。 也是一种选择。]

总有要与依赖时要权衡,你有什么妥协可能需要你做出平衡依赖的实用性和必要性。

调查低水平运API调用,他们可能会提供给你一个解决方案。

例如,使用间谍++可以发现,然后您可以搜索并关闭窗口名称。 然后使用Windows API标注...

using System.Runtime.InteropServices;

// Get a handle to an application window.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

然后在后台线程,写一个过程,寻找这些窗口并关闭它们。

//Some PsuedoCode, note loop should have a cancel condition!
while (true)
{
//Get a handle.
handle = FindWindow(windowClassName, windowName);

//We found the window, close it
if (handle != IntPtr.Zero)
{
//Send Close Command
SetForegroundWindow(handle);
SendKeys.SendWait("%{F4}");
}

//Wait 200ms seconds before trying again
System.Threading.Thread.Sleep(200);
}

你也许可以做一些类型的像这样的hackish解决方案的应用程序。

请注意,您必须将windowClassName(S)和windowName(S)存储在一些配置文件或应用程序中的硬编码它们。

真的没有办法阻止,如果它觉得有必要这么做弹出界面任意(非管理)DLL。

一个丑陋的变通方法虽然是立即尝试关闭窗口它弹出后。 我会做到这一点的方法是

  • 启动另一个线程。 它的工作就是录​​制过程中的当前活动窗口并关闭所有新的窗户露面。
  • 拨打电话到DLL
  • 停止线程

这绝不是防弹的过程,但它可以帮助您解决这个问题。

难道是实用,适合您从Windows服务中运行这些代码?

服务不允许显示GUI(你以前可以选择加入允许服务,以显示图形用户界面,但MS已经被淘汰了这一点)。 我不知道肯定,但我认为的MessageBox()的调用等可以简单地立即返回,当你从一个非交互式服务调用它们。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.855 (s). 10 q(s)