迷失焦点Windows Mobile

时间:2014-06-05 17:21:26

标签: c# windows-mobile-5.0

我在C#中创建了一个应用程序,以满足企业中现有应用程序的某些需求。最近我们不得不购买另一个支持计费的应用程序。这些应用程序运行如下:

第一次申请 - > 2申请 - > 3申请

当我为第三个应用程序执行“Process.Start”时它会打开,但几秒后它就会失去第一个应用程序的焦点。有人知道我怎么能避免这个?

1 个答案:

答案 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秒),然后再更改窗口。