我有一个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;
}
答案 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。