撩妹小工具 MarvellousMouse

来源:https://www.cnblogs.com/chendasxian/archive/2022/03/27/16063479.html
-Advertisement-
Play Games

#前言 ####之前在知乎閑逛看有意思的項目的時候,發現一個前輩曾做過一個在滑鼠周圍隨機生成愛心的小程式,閑來無聊實現了一版隨機生成彩色小球的(因為沒有女朋友,只是練練手)。最近疫情在網上撩了一個小妹妹,她知道這個程式之後,讓我給她做一個“格桑花”版的。我想著應該差不多,就改了改代碼。好感度+1(不 ...


前言

之前在知乎閑逛看有意思的項目的時候,發現一個前輩曾做過一個在滑鼠周圍隨機生成愛心的小程式,閑來無聊實現了一版隨機生成彩色小球的(因為沒有女朋友,只是練練手)。最近疫情在網上撩了一個小妹妹,她知道這個程式之後,讓我給她做一個“格桑花”版的。我想著應該差不多,就改了改代碼。好感度+1(不一定有),但是妹汁送我一杯奶茶,嘻嘻。話不多說,下麵介紹一下。


實現

總的思路很簡單,就是獲取滑鼠的位置,然後再滑鼠周圍隨機進行動畫。實現主要分為這幾個函數。

            InitProperty();    //初始化動畫配置,放到多大,透明度多少,持續時間
            InitGraph();      //初始化需要放大的樣式,只要繼承FrameworkElement類就可以了
            MaxmizeAndTransparenceWindow();       //視窗設置,設置全屏,還有一個坑(放大比)
            StartMarvellousMouse();       //核心代碼,隨機生成小球

1.初始化屬性

這裡動畫主要是樣式放大的一些設置:長寬,透明度。是WPF比較基礎的類FrameworkElement的屬性。

           private void InitProperty()
        {
            MyStoryBoard = new Storyboard();
            //MyStoryBoard.RepeatBehavior = RepeatBehavior.Forever;
            DAWidth = new DoubleAnimation();
            DAWidth.From = 0;
            DAWidth.To = 2 * Radius;
            DAWidth.Duration = new Duration(TimeSpan.FromMilliseconds(DurationTime));
            DAHeight = new DoubleAnimation();
            DAHeight.From = 0;
            DAHeight.To = 2 * Radius;
            DAHeight.Duration = new Duration(TimeSpan.FromMilliseconds(DurationTime));
            DAOpacity = new DoubleAnimation();
            DAOpacity.From = 0;
            DAOpacity.To = 0.7;
            DAOpacity.Duration = new Duration(TimeSpan.FromMilliseconds(DurationTime));
            MyStoryBoard.Children.Add(DAWidth);
            MyStoryBoard.Children.Add(DAHeight);
            MyStoryBoard.Children.Add(DAOpacity);
        }

2.初始化樣式

這裡一開始是使用WPF的自定義控制項比如ellipse,等。後來給妹汁做格桑花的時候,突然想到:圖片不就是天然的FrameworkElement嘛,所以理論上啥樣式都已放進圖片並顯示。順帶說一句,圖片資源獲取網上搜一下,然後在Google活bing的識圖裡面找類似的。
很難找到背景透明的圖(比如帶白底),可以用ps工具,或者網上的去底色工具或網址(我直接百度搜了個網址就可以用)。反正圖片放大的也不大,略微丟失一點邊邊角角無傷大雅。

        private void InitGraph()
        {
            var elements =ElementProvider.GetElements<MyImage>();
            if (elements != null)
            {
                foreach (var item in elements)
                {
                    this.canvas.Children.Add(item);
                }
            }
            NumofGrap = this.canvas.Children.Count;
        }


3.屏幕最大化及一些設置

這裡的一個坑就是,不是所有的屏幕都是100%放大,在一些筆記本上可能解析度調的超級高,然偶後放大到200%,所以滑鼠位置會有問題。這裡計算了下放大比,然後滑鼠的XY乘以繫數。

        private void MaxmizeAndTransparenceWindow()
        {
            this.Width = SystemParameters.PrimaryScreenWidth;
            this.Height = SystemParameters.PrimaryScreenHeight;
            var hdc = GetDC(GetDesktopWindow());
            int ResolutionHeight = GetDeviceCaps(hdc, 10);        //高
            int ResolutionWidth = GetDeviceCaps(hdc, 8);       //寬
            ScaleX = (double)(ResolutionWidth / Width);
            ScaleY = (double)(ResolutionHeight / Height);
            this.Top = 0;
            this.Left = 0;
            this.WindowStyle = WindowStyle.None;
            this.ResizeMode = ResizeMode.NoResize;
            this.Topmost = true;
        }

4.核心顯示

就是不停地獲取滑鼠位置,然後隨機再滑鼠周圍生成圖案。這裡因為是死迴圈瘋狂更新,所以記憶體會爆炸。所以設置線程需要休息一會會再發送(及時1ms也足夠了)。

        private void StartMarvellousMouse()
        {
            POINT lpPoint;
            var widthProperty = new PropertyPath("Width");
            var heightProperty = new PropertyPath("Height");
            var opacityProperty = new PropertyPath("Opacity");
            new Thread(() =>
            {
                while (true)
                {
                    for (int i = 0; i < NumofGrap; i++)
                    {
                        GetCursorPos(out lpPoint);
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            if (i == NumofGrap) return;           //防止迴圈i=NumofGrap的時候,ui線程正好訪問
                            var item = (FrameworkElement)this.canvas.Children[i];
                            Canvas.SetLeft(item, (lpPoint.X - Radius + RandomDistance) / ScaleX);
                            Canvas.SetTop(item, (lpPoint.Y - Radius + RandomDistance) / ScaleY);
                            //item.Fill = RandomColor;
                            Storyboard.SetTarget(DAWidth, item);
                            Storyboard.SetTargetProperty(DAWidth, widthProperty);
                            Storyboard.SetTarget(DAHeight, item);
                            Storyboard.SetTargetProperty(DAHeight, heightProperty);
                            Storyboard.SetTarget(DAOpacity, item);
                            Storyboard.SetTargetProperty(DAOpacity, opacityProperty);
                            MyStoryBoard.Begin();
                        }));
                        Thread.Sleep((int)DurationTime / NumofGrap);
                    }
                }

            }).Start();
        }

最後預祝我能追到妹汁吧,感謝。

代碼開源:[email protected]:liuchuomidi/MarvellousMouse.git


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 阿珍:“老徐,你這茶杯了泡的什麼?紅紅的。” 老徐:“這是枸杞呀。” 阿珍:“枸杞?你最近什麼乾多了,這麼虛!” 老徐:“怎麼可能?看我這身體,不弱的好吧!” 阿珍一臉壞笑地說:“那就是軟了。” 老徐的老臉一紅,辯解到:“我這是養養生,我很強的,好吧。” ...
  • GoSDK安裝 下載 GO SDK 配置環境變數 在文件最後添加以下內容 方式一:系統環境變數 方式二:用戶環境變數 更新配置文件 查看go-SDK 是否安裝成功 ...
  • 1.前言 工作中難免會遇到維護別人代碼的情況,那麼首先就得看懂別人寫的代碼。如果對方寫的代碼混亂臃腫,維護成本必然很高,如果對方寫的代碼優雅清晰,那維護的人看起來必然心情愉悅。正所謂“前人栽樹,後人乘涼;前人埋坑,後人罵娘”。 代碼首先是給人看的,其次才是給機器看到,如何編寫出任何人都看到懂的代碼? ...
  • 很多時候一首音樂大家都只記得高潮部分,很多人在聽歌的時候也只喜歡聽高潮部分。但是,我們不可能對每一段音樂都進行高潮部分的剪輯吧,聽著 我都累了。所以,教大家怎麼怎麼提取音樂的高潮部分。 1.原理 不知道大家有沒有這樣的體會,大部分時候,歌曲的高潮部分通常是重覆次數最多的部分。因此我們可以根據這一個特 ...
  • 我突然很好奇,你說那些什麼18幾年的茅臺真的是18幾年就開始釀的嗎?還有就是一個月要賣那麼多,貨是怎麼供過來的?最後就是,一瓶那麼貴,那一個月賺多少?好多的疑問啊,就用Python揭開神秘的面紗吧。 如圖1所示是網易財經展示的貴州茅臺股票的歷史交易數據。 單擊“下載數據”超鏈接,會彈出如圖2所示的對 ...
  • 很快啊Spring Authorization Server又發新版本了,現在的版本是0.2.3。本次都有什麼改動呢?我們來瞭解一下。 0.2.3版本特性 本次更新的新特性不少。 為公開客戶端提供預設的設置 根據RFC6479,包含授權碼(authorization_code)授權並且客戶端認證方式 ...
  • 1.現實中的問題 我們知道資料庫的數據,基本80%的業務是查詢,20%的業務涵蓋了增刪改,經過長期的業務變更和積累資料庫的數據到達了一定的數量之後,直接影響的是用戶與系統的交互,查詢時的速度,插入數據時的流暢度,系統的可用性,這些指標對用戶體驗都是會有影響的,不說用戶,你自己用是什麼感覺?我經歷過且 ...
  • 痞子衡嵌入式半月刊: 第 51 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...