0

C# アプリケーションの 1 つで Sopcast activex プラグイン (sopocx.ocx) を使用しています。プレーヤーのステータス (「チャンネルをバッファリング中」、「チャンネルを再生中」、「チャンネルをオフライン中...」) とバッファリングの割合を取得したいと考えています。これらの情報は両方ともプレーヤーに表示されます(写真を投稿しようとしましたが、まだ十分な評判がありません)。

問題は、Sopcast の activex プラグインがこれらの情報を取得するためのメソッドを提供していないことです。

誰かがこれをどのように行うことができるかについて何か考えがありますか??

GetWindowText の結果は空の文字列になります...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace test
{


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

    private void testToolStripMenuItem_Click(object sender, EventArgs e)
    {
        IntPtr hwnd = sopcast.Handle;
        StringBuilder lpString = new StringBuilder(256);

        GetWindowText(hwnd, lpString, 256);

        MessageBox.Show(lpString.ToString());
    }


    private void playToolStripMenuItem_Click(object sender, EventArgs e)
    {
        sopcast.SetSopAddress("sop://broker.sopcast.com:3912/123456789");
        sopcast.SetChannelName("Channel");
        sopcast.Play();
    }
}

}
4

4 に答える 4

1

IDコントロールを識別し、APIウィンドウでテキストを取得できます

于 2012-07-28T11:51:57.907 に答える
1

ここにコード サンプルがあります (メモ帳をアプリケーション名に置き換えます) 最も重要なのは、アプリケーションから ocx ウィンドウの ID コントロールを取得する方法を取得することです。

using System;

System.Runtime.InteropServices を使用します。

System.Text を使用します。

System.Security を使用します。

名前空間アプリケーション

{

public class Program

{

    public static void Main ( )

    {

        IntPtr hwnd = UnsafeNativeMethods.FindWindow("Notepad", null);

        StringBuilder stringBuilder = new StringBuilder(256);

        UnsafeNativeMethods.GetWindowText(hwnd, stringBuilder, stringBuilder.Capacity);

        Console.WriteLine(stringBuilder.ToString());

    }

}

[SuppressUnmanagedCodeSecurity]

internal static class UnsafeNativeMethods

{

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

    internal static extern int GetWindowText ( IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount );

    [DllImport("user32.dll", SetLastError = true)]

    internal static extern IntPtr FindWindow ( string lpClassName, string lpWindowName );



}

}

于 2012-07-28T19:16:03.133 に答える
0

sopcastをダウンロードし、spy++を使用してステータスを取得しようとしています。 ここに画像の説明を入力してください

ご覧のとおり、キャプションはチャンネルではなくステータスです...簡単に取得することはできません ここに画像の説明を入力してください

あなたが捕まえたハンドルは全体のコントロールのためのものです

于 2012-07-29T03:41:47.477 に答える
0

Sopcast は、DrawText を使用してステータス テキストを描画します (API Monitor http://www.rohitab.com/apimonitorを使用して見つけました)。そのため、従来の GetWindowText 関数などを使用してテキストを取得する方法はありません。DrawText 関数をフックすることで、テキストを取得できました。.NET の場合、EasyHook を使用すると、これを行うことができます。私のシナリオ: ActiveX コントロールをホストする winforms アプリがあり、ステータス テキストを取得したいと考えています。

public class hooklocal : EasyHook.IEntryPoint
{
    [DllImport("user32.dll")]
    static extern int DrawText(IntPtr hDC, string lpString, int nCount, IntPtr lpRect, uint uFormat);

    [UnmanagedFunctionPointer(CallingConvention.StdCall,CharSet = CharSet.Auto,SetLastError = true)]
    delegate int DDrawText(IntPtr hDC, string lpString, int nCount, IntPtr lpRect, uint uFormat);

    int DrawTextH(IntPtr hDC, string lpString, int nCount, IntPtr lpRect, uint uFormat)
    {
        //lpString contains the status text 
        return DrawText(hDC, lpString, nCount, lpRect, uFormat);
    }

    public hooklocal()
    {
        try
        {
            var CreateHook = LocalHook.Create(
                 LocalHook.GetProcAddress("user32.dll", "DrawTextW"),
                 new DDrawText(DrawTextH),
                 this);

            CreateHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
        }
        catch (Exception ExtInfo)
        {
            Debugger.Break();
        }

    }

}

使用するには、プログラムの起動時に新しいスレッドでフックローカル クラスをインスタンス化します。

EasyHook のダウンロード https://easyhook.github.io/downloads.html

于 2015-12-24T12:11:37.387 に答える