SDRSharp TETRA plug-in Network Info screen cannot log to file. I coded a simple .NET application with C# which logs PDU information to file (c:\temp\netinfo.txt). The source code and executable (CapTetraNetInfo\CapTetraNetInfo\bin\Release) upload: https://files.fm/u/wvzjc2m9 / https://github.com/OH1GIU-P/CapTetraNetInfo
(Current cell and neighbour cell screens contain grid control, enumchildwindows does not find grid control. E.g. by using sendkey and clipboard [clipboard checkbox] it is possible to capture text from grid control (at first click any cell in the grid to set focus onto the grid))

tetra1.jpgthe-file.jpg
https://ibb.co/e5p1bp

Current cell and neighbour cell screens contain grid control, enumchildwindows does not find grid control. E.g. by using sendkey and clipboard it is possible to capture text from grid control (at first click any cell in the grid to set focus onto the grid).

[DllImport("user32.dll")]
static extern void SwitchToThisWindow(IntPtr hWnd, bool turnOn);
SwitchToThisWindow(hwnd, true);
SendKeys.SendWait("^a");
SendKeys.SendWait("^c");
File.AppendAllText(DateTime.Now.ToString() + Environment.NewLine + Clipboard.GetText());

More advanced and better method for waiting without DoEvents().
using System.Threading;
CancellationTokenSource tokenSource = new CancellationTokenSource();
private async buttonStart_click
Instead of DoEvents: await PutTaskDelay();

        async Task PutTaskDelay()
        {
            try
            {
                await Task.Delay(SCR_DELAY, tokenSource.Token);
            }
            catch (TaskCanceledException ex)
            {
            }
            catch (Exception ex)
            {
            }
        }
Form closing & stop button
tokenSource.Cancel();

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

namespace CapTetraNetInfo
{
    public partial class Form1 : Form
    {

        public delegate bool WindowEnumDelegate(IntPtr hwnd, int lParam);

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(StringBuilder lpClassName, StringBuilder lpWindowName);
        [DllImport("user32.dll")]
        private static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, StringBuilder lParam);
        [DllImport("user32.dll")]
        private static extern int GetWindowText(int hWnd, StringBuilder lpString, int length);
        [DllImport("user32.dll")]
        private static extern int GetWindowTextLength(int hWnd);
        [DllImport("user32.dll")]
        public static extern int EnumChildWindows(IntPtr hwnd, WindowEnumDelegate del, int lParam);
        [DllImport("user32.dll")]
        static extern uint RealGetWindowClass(IntPtr hwnd, StringBuilder pszType, uint cchType);

        const int WM_GETTEXT = 13;
        const int WM_GETTEXTLENGTH = 14;
        const int SCR_DELAY = 2000;

        const string APP_CAP = "CapTetraNetInfo";

        bool run = false;
        int count = 0;
        StringBuilder netinfo = new StringBuilder();

        StringBuilder name = new StringBuilder("Network Info");
        string logFile = @"c:\temp\netinfo.txt";

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            IntPtr hwnd = IntPtr.Zero;
            hwnd = FindWindow(null, name);
            if (hwnd == IntPtr.Zero)
            {
                MessageBox.Show("Cannot find Network Info window", APP_CAP, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                netinfo.Clear();
                labelHwnd.Text = "SDR# TETRA plug-in netinfo window handle 0x" + hwnd.ToString("X");
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                run = true;
                Application.DoEvents();
                WindowEnumDelegate del = new WindowEnumDelegate(WindowEnumProc);
                while (run)
                {
                    EnumChildWindows(hwnd, del, 0);
                    labelCnt.Text = count.ToString();
                    File.WriteAllText(logFile, netinfo.ToString());
                    netinfo.Clear();
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(SCR_DELAY);
                    Application.DoEvents();
                }
            }
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            run = false;
            count = 0;
            labelHwnd.Text = "NULL";
            labelCnt.Text = "0";
            buttonStart.Enabled = true;
            buttonStop.Enabled = false;
        }

        private bool WindowEnumProc(IntPtr ctrl, int lParam)
        {
            int len = 0;
            StringBuilder data;
            StringBuilder className = new StringBuilder(1024);

            RealGetWindowClass(ctrl, className, 1024);
            len = SendMessage(ctrl, WM_GETTEXTLENGTH, 0, null);
            if (len != 0)
            {
                data = new StringBuilder(len);
                SendMessage(ctrl, WM_GETTEXT, (len + 1), data);
                netinfo.Append(data);
                count++;
            }
            return true;
        }

    }
}