1

特定のプロセスがデスクトップ アプリケーションから RAPI をスローして Windows Ce デバイスで実行されているかどうかを知りたい

4

2 に答える 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 に答える