2

ウィンドウ内のボタンのテキストを変更することを任されました。有料サブスクリプションを契約している会社がソース コードを所有しているため、ソース コードを 持っておらず、アクセスすることもできません。

ソースコードなしでボタンのテキストを変更するにはどうすればよいですか? 私は pInvoke を試していますが、問題があります。ウィンドウのタイトルは、誰と作業しているかによって異なります。

「オーダーエントリーシート - LASTNAME, FIRSTNAME」

そのため、win32 呼び出し内ではウィンドウ タイトルを使用できない可能性があります。

FindWindow(string lpClassName, string lpWindowName);

私は両方のパラメータがオプションであることを知っています。Spy++ を使用していますが、何に使用すればよいかわかりませんlpClassName。リストされているクラス名は#32770 (Dialog). 私はそれを試してみましたが、0のリターンを得ました。

IntPtr windowHandle = FindWindow("#32770 (Dialog)", null);

ボタンのテキストを別のプロセスから変更するにはどうすればよいですか?

アップデート

MSDN によると、 SetWindowTextを介してこれを達成できるはずです。

指定されたウィンドウのタイトル バー (ある場合) のテキストを変更します。指定されたウィンドウがコントロールの場合、コントロールのテキストが変更されます。ただし、SetWindowText は別のアプリケーションのコントロールのテキストを変更できません。

SetWindowText を使用してやりたいことができません。他のものを使用することは可能ですか?

4

1 に答える 1

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

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

    [DllImport("user32", SetLastError = true)]
    public static extern int EnumWindows(CallBack x, int y);

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool EnumChildWindows(IntPtr hwndParent, CallBack lpEnumFunc, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, string lParam);

    public const uint WM_SETTEXT = 0x000C;

    public delegate bool CallBack(int hwnd, int lParam);

    public static void Main()
    {
        CallBack windowsCallback = new CallBack(IterateWindows);
        EnumWindows(windowsCallback, 0);        
    }

    public static bool IterateChildren(int hwnd, int lParam)
    {
        string newButtonText = "Some text";
        bool continueIteratingChildren = true;
        //Console.WriteLine("Child handle: " + hwnd);

        int length = GetWindowTextLength((IntPtr)hwnd);
        StringBuilder sb = new StringBuilder(length + 1);
        GetWindowText((IntPtr)hwnd, sb, sb.Capacity);
        //Console.WriteLine(sb);

        if (sb.ToString().StartsWith("My Button Text "))
        {
            HandleRef hrefHWndTarget = new HandleRef(null, (IntPtr)hwnd);
            SendMessage(hrefHWndTarget, WM_SETTEXT, IntPtr.Zero, newButtonText);
            continueIteratingChildren = false;
        }
        return continueIteratingChildren;
    }

    public static bool IterateWindows(int hwnd, int lParam)
    {
        bool continueIteratingWindows = true;
        int windowTextLength = GetWindowTextLength((IntPtr)hwnd);
        StringBuilder sb = new StringBuilder(windowTextLength + 1);
        GetWindowText((IntPtr)hwnd, sb, sb.Capacity);

        if (sb.ToString().StartsWith("My Window Caption"))
        {
            //Console.Write("Window handle is ");
            //Console.WriteLine(hwnd);
            //Console.WriteLine(sb);
            //Console.WriteLine(Marshal.GetLastWin32Error());
            var childrenCallback = new CallBack(IterateChildren);
            EnumChildWindows((IntPtr)hwnd, childrenCallback, IntPtr.Zero);
            continueIteratingWindows = false;
        }
        return continueIteratingWindows;
    }
于 2012-08-01T13:18:56.723 に答える