C#的新手。但由于工作环境,我必须“随时学习”。
我的代码在过去两天里一直在挣扎,我在这里消耗了尽可能多的问题和MSDN上的文章,但我认为他们让我更加困惑。
我使用我的代码启动应用A.应用程序A启动应用程序B(我无法启动应用程序B,我超越了它)
我想用我的代码做的是当应用程序B的MainWindowTitle
可用时,隐藏窗口。
到目前为止,我只能用Thread.Sleep(xxx)
来完成这个任务。在你看到下面的代码之前。
我想避免使用计时器。
我要做的是循环下面的代码直到它成立。
当应用A启动应用B时,MainWindowTitle可用几秒钟。但是代码运行得如此之快,以至于它还没有完成,代码已经完成。
IntPtr hWnd = IntPtr.Zero;
foreach (Process procList in Process.GetProcess())
{
if (procList.MainWindowTitle.Contains("SAP Logon"))
{
hWnd = procList.MainWindowHandle;
}
}
ShowWindow(hWnd, 0);
该代码仅在我之前使用类似的内容时才有效:
Thread.Sleep(10000);
在整个代码块之前。它工作的唯一原因是b / c它允许有足够的时间传递窗口打开并包含我正在寻找的标题。
我试过while循环。
- 在'foreach'之外
- 在'if'
之外- 围绕'foreach'(很快就锁定了系统......)哈哈!
- 围绕'if'
我觉得以下其中一项应该有效,但事实并非如此,或者我完全搞砸了。
while (!procList.MainWindowTitle.Contains("SAP Logon")) { } // ! at the beginning OR
while (procList.MainWindowTitle.Contains("SAP Logon") == null) { } // equaling null OR
while (procList.MainWindowTitle.Contains("SAP Logon") < 0) { } // etc., etc.,
while (procList.MainWindowTitle.DOESNOTContain("SAP Logon")) { } // I know this is wrong but it almost seems like what I need...
有人有什么建议吗?我的大脑是炒鸡蛋,这是我完成这个应用程序所需的最后一点。
如果我唯一的选择是Thread.Sleep()
,那就这样吧,但我宁愿不使用它。
最后一件事:我必须以.net 2.0为目标。
谢天谢地!
答案 0 :(得分:6)
您使用while循环的想法应该有效。你可以尝试这样的事情:
IntPtr hWnd = IntPtr.Zero;
bool isFound = false;
while(!isFound)
{
foreach (Process procList in Process.GetProcess())
{
if (procList.MainWindowTitle.Contains("SAP Logon"))
{
isFound = true;
hWnd = procList.MainWindowHandle;
}
}
Thread.Sleep(100); // You may or may not want this
}
ShowWindow(hWnd, 0);
答案 1 :(得分:1)
您可以只使用EXE本身的名称来检查,而不是在每个进程中检查应用程序的标题。我还会暂停一个好的措施。例如,使用记事本,您可以:
Process[] ps;
DateTime timeout = DateTime.Now.AddSeconds(30);
do
{
System.Threading.Thread.Sleep(100);
ps = Process.GetProcessesByName("notepad"); // <--- no path, AND no extension (just the EXE name)
} while (ps.Length == 0 && timeout > DateTime.Now);
if (ps.Length > 0)
{
ShowWindow(ps[0].MainWindowHandle, 0);
}
else
{
MessageBox.Show("Process Not Found within Timeout Period", "Process Failed to Spawn");
}
答案 2 :(得分:0)