我在C#中创建了一个应用程序,以满足企业中现有应用程序的某些需求。最近我们不得不购买另一个支持计费的应用程序。这些应用程序运行如下:
第一次申请 - > 2申请 - > 3申请
当我为第三个应用程序执行“Process.Start”时它会打开,但几秒后它就会失去第一个应用程序的焦点。有人知道我怎么能避免这个?
答案 0 :(得分:0)
您需要知道窗口类和/或标题,然后可以使用FindWindow来获取窗口的窗口句柄:
[DllImport("coredll.dll", EntryPoint="FindWindowW", SetLastError=true)]
private static extern IntPtr FindWindowCE(string lpClassName, string lpWindowName);
使用窗口句柄,您可以使用SetWindowPos将窗口更改回正常显示:
[DllImport("user32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
例如,如果窗口的类名为" App 3"
...
IntPtr handle;
try
{
// Find the handle to the window with class name x
handle = FindWindowCE("App 3", null);
// If the handle is found then show the window
if (handle != IntPtr.Zero)
{
// show the window
SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);
}
}
catch
{
MessageBox.Show("Could not find window.");
}
要查找窗口的类和标题,请启动CE远程工具" CE Spy" (应用程序3启动时)(VS安装的一部分)。然后浏览窗口列表并查看应用程序3窗口。双击列表中的条目,您将获得应用程序3的类名称和标题。
您还可以使用简单的ShowWindow API代替额外的SetWindowPos:
[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);
enum ShowWindowCommands
{
Hide = 0,
Normal = 1,
ShowMinimized = 2,
Maximize = 3, // is this the right value?
ShowMaximized = 3,
ShowNoActivate = 4,
Show = 5,
Minimize = 6,
ShowMinNoActive = 7,
ShowNA = 8,
Restore = 9,
ShowDefault = 10,
ForceMinimize = 11
}
...
IntPtr handle;
try
{
// Find the handle to the window with class name x
handle = FindWindowCE("App 3", null);
// If the handle is found then show the window
if (handle != IntPtr.Zero)
{
// show the window
ShowWindow(handle, ShowWindowCommands.Normal);
}
}
catch
{
MessageBox.Show("Could not find window.");
}
有关FindWindow和SetWindowPos的pinvoke的详细信息,请参阅pinvoke.net和MSDN。关于Win32编程的最佳书是Charles Petzold的编程Windows。
当你开始这个过程时,你需要操作系统给你一些时间来解决应用程序(让我们说1-3秒),然后再更改窗口。