在没有窗口把手的情况下将窗口带到前景

时间:2011-04-18 20:50:48

标签: c# .net windows windows-ce compact-framework2.0

我有一个Windows CE嵌入式6.0应用程序,它在后台打开另一个应用程序,我想把另一个应用程序带到前面。我首先尝试使用第三方应用程序的MainWindowHandle设置SetParent,但它没有用。然后我再次在同一个MainWindowHandle上尝试了SetActiveWindow,它没有用。这让我相信MainWindowHandle搞砸了,当我在控制台上打印它时,它总是为0.这让我想到了第一个问题:应用程序的开发设备是否有可能忘记提到MainWindow是什么?或者它是否在.NET中自动分配?

其次,既然这种方法失败了,我尝试了EnumWindows,然后获取每个窗口的ID并将其与我所知道的我所需程序的进程ID相匹配。这给了我一个异常0x80131515说不支持“EnumWindows”。我从CoreDll导入了EnumWindows就好了。第二个问题:这个错误的原因是什么?我做错了什么?

抱歉!这是一些代码(假设VCProcess已经启动):

    [DllImport("coredll.dll")]
static extern int EnumWindows(CallbackDef callback, int lParam);

    [DllImport("coredll.dll")]
    static extern int GetWindowThreadProcessId(IntPtr hWnd, int pid);

    static void Main()
    {
        callBackPtr = new CallBackPtr(Report);  
        EnumWindows(callBackPtr, 0);
    }

    public static bool Report(int hwnd, int lParam)
    {
        int pid = 0;
        GetWindowThreadProcessId(hWnd, pid);
        if (pid == VCProcessId)
        {
            SetForegroundWindow(hWnd);
        }
        MessageBox.show("Window handle is "+hwnd);
        return true;
    }

2 个答案:

答案 0 :(得分:1)

您的OEM必须未包含对EnumWindows的支持。您可以尝试使用FindWindow

我可能会P / Invoke SetForegroundWindow这样做。如果应用程序在后台,则SetActiveWindow不起作用。

-PaulH


修改

P / Invoking EnumWindows不能抛出System.NotSupportedException(除非你将其抛入代码中)并且GetLastError()不会返回HRESULT COR_E_NOTSUPPORTED。你的代码中有些东西可疑。

答案 1 :(得分:1)

我在遇到同样的问题并解决之后回答了这个问题。

虽然OEM可能不会将操作系统的某些部分作为WindowsCE的一部分(其模块化架构的性质)包含在内,但是像EnumWindows这样的调用或大多数其他低级调用也是如此。 ,本质上是操作系统的一部分,删除它们会很疯狂。

我实际上收到了一位来自Microsoft工程师(!)的消息,该消息指出问题是回调的定义方式。虽然我尝试了不同的方法(委托,intPtr vs int等),但他给出了以下答案,这些答案在WindowsCE 5/6中适用于不同的设备:

[”来自.Net / C#的EnumWindows调用应用程序导致NotSupportedException 0x80131515“错误,因为它仅支持整数返回类型:I2,I4等。这适用于所有回调方法,可能因呼叫而异正在使用]

所以INSTEAD OF定义你的回调就像你做的那样(我试过代理,WinProcs和其他人也失败了),把它定义为:

[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.I4)]
private static extern int EnumWindows(IntPtr callPtr, int param);

完美无缺!!

以下是我的工作代码实现这种方法,并在运行PocketPC / WindowsCE等的不同设备中完美运行:

public delegate int CallBackPtr(int hwnd, int param);

[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.I4)]
private static extern int EnumWindows(IntPtr callPtr, int param);

private static List<IntPtr> windows = new List<IntPtr>();

private static int CallBackMethod(int hwnd, int param)
{
    windows.Add(new IntPtr(hwnd));
    return 1;   
}

private static void GetAllWindowsHandles()
{
   // using a delegate does NOT work.
   //EnumWindows(delegate(IntPtr wnd, IntPtr param)
   //{
   //    windows.Add(wnd);
   //    return true;
   //}, IntPtr.Zero);

   CallBackPtr callbackPtr = CallBackMethod;
   IntPtr cb = Marshal.GetFunctionPointerForDelegate(callbackPtr);
   EnumWindows(cb, 0);
}

CJ。