ラベル PC の投稿を表示しています。 すべての投稿を表示
ラベル PC の投稿を表示しています。 すべての投稿を表示

2026年2月8日

Windows11の、右下に出てくるポップ広告を出た瞬間に消すアプリ(2)「PopSentry02.exe」

 ここで、コードを全部公開する。

プログラミングは40年も昔にN88_BASICでちょこっとやっただけなので、とても自信が無いけど、AIの力をお借りしてなんとか形になったとは思う。コード生成はAI任せだったので全くわかりません。でもちゃんと機能してるみたいですよ。



このアプリは、「PopSentry02.exe」という名前にした。POPの見張番という意味だ。

インストール不要、Windows11の適当なフォルダにコピーして、ショートカットをスタートアップにおいておくだけで、起動時に常駐する。

アプリの説明だけど、ここにWIN11機がないからスクショが取れない、よって言葉だけで説明する。

ポップが出た瞬間に感知し、表示の許可を求めてくる。重要だと思えば「はい」にすれば、同種のポップは今後も同じように表示してくる。不要なポップは「いいえ」を選べば、ブラックリストに追加され、瞬時に消され、今後一切出てきた瞬間に消去される。

という感じのアプリです。

https://github.com/sanmasystem-Jima/Popsentry02

ここで公開しました!github


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


using Newtonsoft.Json;

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Drawing;

using System.IO;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading;

using System.Windows.Forms;


namespace PopSentry

{

    internal static class Program

    {

        // WinAPI

        private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);


        [DllImport("user32.dll")]

        private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);


        [DllImport("user32.dll")]

        private static extern bool IsWindowVisible(IntPtr hWnd);


        [DllImport("user32.dll")]

        private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);


        [DllImport("user32.dll")]

        private static extern int GetWindowTextLength(IntPtr hWnd);


        [DllImport("user32.dll")]

        private static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);


        [DllImport("user32.dll")]

        private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);


        [DllImport("user32.dll")]

        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);


        private const uint WM_CLOSE = 0x0010;


        [StructLayout(LayoutKind.Sequential)]

        private struct RECT

        {

            public int Left;

            public int Top;

            public int Right;

            public int Bottom;

        }


        // 設定

        class Settings

        {

            public List<string> WhiteList { get; set; } = new List<string>();

            public List<string> BlackList { get; set; } = new List<string>();

        }


        private static Settings settings = new Settings();

        private const string SettingsFile = "popsentry.json";

        private const string LogFile = "popsentry.log";


        [STAThread]

        static void Main()

        {

            bool createdNew;

            using (var mutex = new System.Threading.Mutex(true, "PopSentryMutex", out createdNew))

            {

                if (!createdNew)

                {

                    MessageBox.Show(

                        "PopSentry はすでに起動しています。",

                        "PopSentry",

                        MessageBoxButtons.OK,

                        MessageBoxIcon.Information

                    );

                    return;

                }


                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);


                LoadSettings();


                // トレイアイコン

                NotifyIcon icon = new NotifyIcon();

                icon.Icon = SystemIcons.Information;

                icon.Visible = true;

                icon.Text = "PopSentry - 稼働中";


                ContextMenuStrip menu = new ContextMenuStrip();

                menu.Items.Add("ログを開く", null, (s, e) =>

                {

                    if (File.Exists(LogFile))

                        Process.Start("notepad.exe", LogFile);

                });

                menu.Items.Add("終了", null, (s, e) =>

                {

                    icon.Visible = false;

                    Application.Exit();

                });

                icon.ContextMenuStrip = menu;


                // 監視スレッド

                Thread t = new Thread(RunLoop);

                t.IsBackground = true;

                t.Start();


                Application.Run();

            }

        }


        private static void RunLoop()

        {

            while (true)

            {

                EnumWindows(EnumWindowCallback, IntPtr.Zero);

                Thread.Sleep(300);

            }

        }


        private static bool EnumWindowCallback(IntPtr hWnd, IntPtr lParam)

        {

            if (!IsWindowVisible(hWnd))

                return true;


            int length = GetWindowTextLength(hWnd);

            if (length == 0)

                return true;


            StringBuilder sb = new StringBuilder(length + 1);

            GetWindowText(hWnd, sb, sb.Capacity);

            string title = sb.ToString();


            if (!GetWindowRect(hWnd, out RECT rect))

                return true;


            var screen = Screen.PrimaryScreen.WorkingArea;


            bool isRightBottom =

                rect.Left > screen.Right - 800 &&

                rect.Top > screen.Bottom - 800;


            if (!isRightBottom)

                return true;


            GetWindowThreadProcessId(hWnd, out uint pid);

            string procName = "unknown";


            try

            {

                using (var p = Process.GetProcessById((int)pid))

                    procName = p.ProcessName;

            }

            catch { }


            // ホワイト → 毎回ログしてスルー

            if (settings.WhiteList.Contains(procName))

            {

                LogWhite(procName, title);

                return true;

            }


            // ブラック → 毎回ログして即死

            if (settings.BlackList.Contains(procName))

            {

                LogKill(procName, title);

                SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

                return true;

            }


            // 未登録 → ユーザーに聞く

            DialogResult result = MessageBox.Show(

                $"このポップアップを許可しますか?\n\nプロセス: {procName}\nタイトル: {title}",

                "PopSentry",

                MessageBoxButtons.YesNo,

                MessageBoxIcon.Question);


            if (result == DialogResult.Yes)

            {

                settings.WhiteList.Add(procName);

                SaveSettings();

                LogWhite(procName, title);   // 初回ログ

            }

            else

            {

                settings.BlackList.Add(procName);

                SaveSettings();

                LogKill(procName, title);    // 初回ログ

                SendMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

            }


            return true;

        }


        private static void LoadSettings()

        {

            try

            {

                if (File.Exists(SettingsFile))

                {

                    string json = File.ReadAllText(SettingsFile);

                    settings = JsonConvert.DeserializeObject<Settings>(json) ?? new Settings();

                }

            }

            catch

            {

                settings = new Settings();

            }

        }


        private static void SaveSettings()

        {

            try

            {

                string json = JsonConvert.SerializeObject(settings, Formatting.Indented);

                File.WriteAllText(SettingsFile, json);

            }

            catch { }

        }


        // ホワイトログ(毎回)

        private static void LogWhite(string procName, string title)

        {

            try

            {

                string line = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} WHITE {procName} | {title}";

                File.AppendAllText(LogFile, line + Environment.NewLine);

            }

            catch { }

        }


        // ブラックログ(毎回)

        private static void LogKill(string procName, string title)

        {

            try

            {

                string line = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} KILL {procName} | {title}";

                File.AppendAllText(LogFile, line + Environment.NewLine);

            }

            catch { }

        }

    }

}

2026年2月7日

Windows11の、右下に出てくるポップ広告を出た瞬間に消すアプリを作ったよ。

 去年の10月14日に、長年使ってきたWindows10が使えなくなったのは皆様ご存知の通りです。私めの、dynabook_T75/RR2だけど、10年以上使ってきたかわいいPCが、MS帝王の意向により今後使用できなくなったわけであります。

そんな折、Ubuntuというものがあるということで、T75/RR2は延命処置を受け、ここに甦って現役で動いているわけであります。

しかし、会社で使用しているPCにおいては、W11に強制アップグレードされたのです。

長年連れ添ったおとなしいけど有能なW10と強制的にお別れさせられたと思ったら、高飛車な公爵令嬢が嫁に来た感じです。

AIさんに描画してもらったのがあるのでここに貼ってみます。(Copilot)

このお姉さんがW10だよ。静かで優しくて従順で有能だった。でも強制的にお別れさせられた。(描画:Copilot)



この人が新しい嫁さんのWIN11令嬢。
きれいだけど、能天気でおせっかいでやかましいんだよ
(描画:Gemini)


Upgradeがとんでもないダウングレードだったことに気付いたときは、もうWIN10はサポート外だったわけです。


どういうことかと、簡単に申し上げます

なんなら、日本語IMEが勝手に終わって、ローマ字モードになってる。 いちいち広告がでて集中をそがれる。その設定をいじれば消えるんじゃない?と設定をいくらいじっても、IMEの勝手な終了と広告を消し去ることはできなかった。

そういうわけで、MS帝国の出先機関であるCopilotにその旨苦情を申立たわけです。

Copilot「それは仕様です」

俺「ぷち」

何十年ぶりかに切れましたよ。

そういうわけで、WIN11の開発環境を仕入れて、ポップを物理的に出ないようにするアプリの開発に手を染めたわけであります。


・・・続く


2020年3月22日

無限インクタンク


昨年の暮れに長年使ってたプリンターが終了されたので
エディオンの初売りで急遽購入(7000円)して正月に年賀状を作成したと言う、ある意味正しい行為。


そのニュープリンタのインクが終了したので(替えのインクカートリッジは6000円もする!)


ヤフオクで
1000円のジャンクプリンタを購入。
EPSON  EP-803AW 

放置されていたプリンタのヘッドの詰まりをクリーニングするのに、インクカートリッジをワンセット消費したりするので


昔に買ってあった外付けインクタンクを設置しました。

インクカートリッジに悩まされない、快適な環境を取り戻すことができました。

2019年12月31日

年末あるある『プリンター終了』


大晦日に年賀状を印刷するやつが悪いのですが、急に何故かプリンターのスキャナーが取れました。
10年以上使われてきたEPSON EP-803ですが、ヒンジが割れたみたいでこれは直せない。

2018年8月31日

ノートPCのディスプレーが割れたので交換する

うちのPC東芝ダイナブックT75ですが、液晶が割れたので交換しましょう。
部品はヤフオクで8,500円でした。

使用に問題はあんまりないのですが
やってみたかったので。

2018年8月25日

21世紀になったと実感しています。

ワタシのPC は、東芝ダイナブック、ウィンドウズ8.1、コア7i メモリ8G搭載の超高級機でありますが、
液晶が割れました。



2018年8月15日

実験

https://youtu.be/HkXuwzSjGIc
ワイヤーで草刈する動画。
動画を日記にはりつける実験。
とても危険なので真似したいとは思わないが、こういう姿勢は嫌いじゃない。

2018年8月12日

アンドロイドの、スワイプで再読み込みが鬱陶しいのでしなくさせる設定

PC が壊れたので、ここのところアンドロイドスマホでchlome使って日記の入力してるんですが、
ええオッサンがスマホをスイスイいじってるのがはたから見てどうかというのは置いておいて、
長文入力していると、一回一番上に戻ろうとして、勢いで再読み込みしてしまうことが良くあります。

あまり高速なwifi 環境じゃないので、その都度待たされてイライラしてたのですが、
この度、スワイプで再読み込みさせない設定を見つけたので、忘れないよう記録しておきます。

アドレスにchrome://flags/と入力してエンター
The pull to refresh を探して、
Disabled にしました。

で、clome の再起動。

これでイライラの元が一個減って一歩幸せに近付きました。

2018年3月5日

エプソンがエコタンク搭載プリンターを発売したみたい。

ようやくですが、プリンターメーカーのエプソンが
純正で詰替式のインクタンク搭載プリンターを、国内市場で発売したみたい。

http://www.epson.jp/products/ecotank/

2017年12月14日

3TBのHDDを買った

 家で使用してる、WIN7のPCですが、

5年間くらい適当に使いっぱなしにしてたら、

ドエライデーターが溜まってしまい、動きが悪い。
中には写真や動画データばかりなので、消すことも出来ないし。

2017年2月24日

腰痛対策 

5年ぶりくらいにやってしまいました。
しつこい腰痛です。

この荷物を積んでいるときに
やっちまいました
寒い朝、倉庫の整理をしていました。
作業場所が狭いためしゃがんだらシリがつかえるので
前屈した体勢で培土の袋を抱えて持ち上げていたら

ピキっと痛みが走りました。
作業に適した体勢というものがありますが、実行していませんでした。

2017年2月23日

プリンターの廃インクエラー解除 EPSON Adjsutment Program WIN8.1でも使えました Communication error! Error Code:21000068にならない設定

わたしのところでは、プリンターはEPSON EP-803AWを使っています。
WIN7のPCで使用していましたが、HDDのクラッシュによりWIN8.1のPCに代替りしました。

自分で言うのもアレですがプリンターについてはかなりのハードユーザーです。
純正カートリッジは1週間で使い切り、やりきれませんのでプリンターに改造を加えました。
時期が来れば必ず発生するという、廃インクタンクエラーについては、解除ソフト「EPSON Adjsutment Program」(入手法
を入手してつつがなく使用できていました。

大事なEP-803AWを、ずっと末永く使えるものと思っていましたが、
PCが代替わりしたことでそのAdjsutment Programが利用できなくなっていました。

2017年2月19日

EPSONインクジェットプリンターEP-803AWを使い倒す。 外部タンク取付 廃インクエラー解除

EP-803AWを使ってます。
業務において、書類を印刷する機会はとても多いですが、

忙しいときに限ってプリンターエラーが出たり、インクが空になったりする  ٩(๑`н´๑)۶

しかもそのインクがバカに高価で、
A4の紙、500枚で250円くらいのを印刷しようとすると、
純正のインク1セット6000円位するのを2セットくらい消費します。