화면에 댓글을 표시하는 발표자 애플리케이션을 C# 및 PowerAutomate로 만들어 보았습니다.

발표 분위기를 띄우려고요.


인터넷이 주류가 된 요즘, 발표하는 자리도 온라인이 많죠.
온라인 발표는 상대방의 반응을 이해하기 어려워 발표자에게 심리적인 것이 있을 수 있기 때문이다.
청취자들이 팀스와 줌의 댓글창에도 이름이 나오기 때문에 많은 사람들의 발표장에서'88888888888'을 치는 것은 조금 용기가 난다.
그래서 저는 공부를 하면서 리스트에서 발표자의 화면에 평론을 표시하는 메커니즘을 만들어 봤습니다.

데모 완료


창에 주석 입력


청중은 Microsoft Forms를 통해 의견을 발표할 수 있습니다.
포엠스는 한 개의 댓글을 보내면'써줘서 고마워'페이지로 날아가기 때문에 댓글을 연달아 던질 수 없다는 게 약점이다.
아마도 한 화면이 닿을 수 있는 사람과css의 사람만 있으면 될 것이다.
이번에는 Power Automate 학습을 병행하기 때문에 Forms 형식으로 해 보겠습니다.

발표자 화면에 댓글이 떴어요.


청중이 보낸 댓글은 오른쪽부터 방송된다.
'8888888'등 화면이 가득한 것을 보면서 발표자는 정신적으로 안심이 되겠죠.
다만 부적절한 댓글도 화면에 나올 수 있으니 주의해야 한다.
Forms를 사용하면 누구의 댓글을 기록할지 발표해서 잠시 뒤집어놔요.

시스템 개요도


Forms에서 작성한 정보는 Power Automate를 통해 One Drive의 텍스트 파일에 기록됩니다.
이 텍스트 파일은 클라우드 환경과 로컬 환경과 동기화되어 로컬에 떨어집니다.
로컬 파일을 읽고 C# 결합된 데스크톱 응용프로그램으로 표시합니다.

실장 디테일


Power Automate


Power Automate는 간단합니다.
전체적으로 이런 느낌.

Forms에 의견을 작성하여 보내면 Flow에 불이 나며 응답 상세 정보를 볼 수 있습니다.

그런 다음 One drive의 텍스트 파일을 가져와 내용을 기록합니다.

One drive의 텍스트 파일 로그인 이쪽에서, 맨 윗부분 디렉터리에 있는test.이번에는 txt를 활용해 보자.

text.txt의 내용은 이런 느낌입니다.
Forms로 보낸 내용은 해당 텍스트 파일 뒤에 "(응답 내용)"형식으로 추가됩니다.

One Drive 동기화


동기화 방법은 공식 사이트를 참조하십시오.
오른쪽 아래에 One Drive 아이콘이 있으면 동기화합니다.
없으면 One drive의 텍스트 파일이쪽에서에 로그인하고 "동기화"단추를 누르십시오.

동기화 후 로컬 One Drive 폴더, test를 확인합니다.txt가 왔는지 확인해 주세요.

C#를 통한 데스크탑 애플리케이션 구축


이번에는 Visual Studio를 사용하여 C#로 데스크톱 애플리케이션을 만들었습니다.
・TransparencyKey:Control
・BackColor:Control
・WindowState:Maximized
배경이 투명한 데스크톱 응용 프로그램이 전체 화면에 표시됩니다.
이것은 텍스트를 읽는 label을 오른쪽에서 왼쪽으로 흐르는 인상입니다.


글로벌 변수를 정의합니다.
initial_ballPos: 초기 댓글의 위치
loc_표시된 주석 번호
ballSpeed: 댓글 흐름의 속도
stacking_comment_스택에 올라온 댓글 일람표.
onFloating_재생 목록
onWaiting_재생되지 않은 화면 밖에서 기다리는 label 일람표
그렇습니다.
        //変数宣言
        Point[] initial_ballPos = new Point[10] {
            new Point(1600, 50),
            new Point(1700, 100),
            new Point(1800, 150),
            new Point(1900, 50),
            new Point(2000, 100),
            new Point(2100, 150),
            new Point(2200, 50),
            new Point(2300, 100),
            new Point(2400, 150),
            new Point(2500, 200)
        };

        Random r = new Random();
        int loc_idx = 0;

        //Point[] ballPos = new Point[10];
        Size ballSpeed = new Size(-8,0);
        
        //来たコメントリスト
        Stack<string> stacking_comment_list = new Stack<string>();
        
        //流れているラベル一覧
        List<Label> onFloating_list = new List<Label> {};

        //待っているラベル一覧
        Stack<Label> onWaiting_list = new Stack<Label>();
폼을 읽으며 각종 초기화를 하고 타이머를 설정합니다.
comment_timer는 onepdrive에서 댓글을 얻는 타이머로 3초마다 한 번씩 찬다.
move_timer는 주석을 그리는 데 사용되는 타이머로 33밀리초마다 한 번씩 보냅니다.
 public Form1()
        {
            InitializeComponent();
    
	    List<Label> label_list = new List<Label> { label1, label2, label3, label4, label5, label6, label7, label8, label9, label10 };
            for (int idx = 0; idx < 10; idx++)
            {
                label_list[idx].Location = initial_ballPos[idx];
                onWaiting_list.Push(label_list[idx]);
            }

            stacking_comment_list.Push("テストでーす");
           
            Timer comment_timer = new Timer();
            comment_timer.Interval = 3000;
            comment_timer.Tick += new EventHandler(GetComment);
            comment_timer.Start();

            Timer move_timer = new Timer();
            move_timer.Interval = 33;
            move_timer.Tick += new EventHandler(Update);
            move_timer.Start();
        }
3초 간격으로 차는 GetCommerent 방법은 다음과 같습니다.
쉼표로 구분된 텍스트로 주석 가져오기, Stackingcomment_목록에 저장합니다.
읽은 후에 새 텍스트를 만들고 덮어씁니다,test.txt를 새로 고칩니다.
private void GetComment(object sender, EventArgs e)
        {
            string[] return_list = new string[11];
            string combined_path = Path.Combine(ここにonedriveのパスを入れる, "test.txt");
            List<string> additional_comment_list = new List<string>();

            // 読み込みたいCSVファイルのパスを指定して開く
            StreamReader sr = new StreamReader(combined_path);
            {
                // 末尾まで繰り返す
                while (!sr.EndOfStream)
                {
                    // CSVファイルの一行を読み込む
                    string line = sr.ReadLine();
                    // 読み込んだ一行をカンマ毎に分けて配列に格納する
                    return_list = line.Split(',');
                    additional_comment_list.AddRange(return_list);
                }
            }
            sr.Dispose();

            Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
            StreamWriter writer = new StreamWriter(combined_path, false, sjisEnc);
            writer.WriteLine("コメント一覧,");
            writer.Close();

            for (int idx = 1;idx<additional_comment_list.Count;idx++)
            {
                stacking_comment_list.Push(additional_comment_list[idx]);
            }
        }
33ms마다 차는 Update 방법은 다음과 같습니다.
onFloating_목록의 label에서 Location을 이동하고 그립니다.
stacking_comment_리스트에 댓글이 있을 때 onWaiting-목록의 label 텍스트에 삽입하고 놓습니다.
        private void Update(object sender, EventArgs e)
        {
            for (int i = 0; i < onFloating_list.Count; i++)
            {
                onFloating_list[i].Location += ballSpeed;

                if (onFloating_list[i].Right <= 0)
                {
                    onWaiting_list.Push(onFloating_list[i]);
                    onFloating_list.RemoveAt(i);
                }
            }

            //コメントが来ているとき
            if (stacking_comment_list.Count != 0) {
                if (onWaiting_list.Count != 0)
                {
                    //待ちラベル一覧から一つ取り出し、コメントを挿入して流れているリストに移す
                    Label next_label = onWaiting_list.Pop();
                    next_label.Text = stacking_comment_list.Pop();

                    loc_idx += r.Next(1, 3);
                    next_label.Location = initial_ballPos[loc_idx%10];
                    onFloating_list.Add(next_label);
                }
            }
            
            // 再描画
            Invalidate();
        }

최후


나는 타이머의 간격에 대해 다양한 취향이 있다고 생각한다. 이 부근은 시행착오점이다.
그리고 현재 코드라면 복수의 댓글이 올라올 때 중복될 위험이 있다.
이 부근이 개선의 중점일 수도 있다.

좋은 웹페이지 즐겨찾기