我想知道某个进程是否从桌面应用程序在 Windows Ce 设备上运行抛出 RAPI
问问题
2606 次
2 回答
2
RAPi 本身没有任何流程管理/工具帮助功能,因此开箱即用您无法做到这一点。我的建议是创建一个自定义 RAPI DLL(此处的示例- 不幸的是,这必须在 C 中完成,但它非常简单),它要么只是通过工具帮助检查您的进程,要么是一个更通用的版本,允许您枚举正在运行的进程,然后使用CeRapiInvoke调用该 DLL。
共享源OpenNETCF 桌面通信库对此函数有一个包装器。
于 2012-05-04T01:54:57.540 回答
1
我找到了一个不同的解决方案,似乎它正在工作。这个想法让应用程序的窗口运行,并搜索应用程序的标题,我认为它不太灵活,但现在还可以,也许稍后我会为 CeRapiInvoke 解决方案更改它。终于得到这个工作
[DllImport("rapi.dll", SetLastError = true)]
internal static extern IntPtr CeGetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
[DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int CeGetWindowText(IntPtr hWnd, StringBuilder name, int nMaxCount);
public enum GetWindow_Cmd : uint
{
GW_HWNDFIRST = 0,
GW_HWNDLAST = 1,
GW_HWNDNEXT = 2,
GW_HWNDPREV = 3,
GW_OWNER = 4,
GW_CHILD = 5,
GW_ENABLEDPOPUP = 6
}
public bool TaskIsRunning(string windowName)
{
IntPtr ptr = CeGetWindow(IntPtr.Zero, GetWindow_Cmd.GW_CHILD);
ptr = CeGetWindow(ptr, GetWindow_Cmd.GW_HWNDLAST);
while (ptr != IntPtr.Zero)
{
StringBuilder sb = new StringBuilder(255);
//string lala = new string(' ', 255);
//lala = null;
int a = CeGetWindowText(ptr, sb, 255);
System.Diagnostics.Debug.WriteLine(a + " " + sb.ToString());
if (sb.ToString() == windowName)
return true;
ptr = CeGetWindow(ptr, GetWindow_Cmd.GW_HWNDPREV);
}
return false;
}
希望这对其他人有帮助
于 2012-05-04T15:28:19.073 回答