diff --git a/disable_netease_shadows.cpp b/disable_netease_shadows.cpp
new file mode 100644
index 0000000..6ea247a
--- /dev/null
+++ b/disable_netease_shadows.cpp
@@ -0,0 +1,202 @@
+/**
+ * https://www.cnblogs.com/Seiyagoo/p/3496945.html
+ * https://blog.csdn.net/ice__snow/article/details/79979298
+ * https://blog.csdn.net/lvbian/article/details/23031635
+ * 
+ * This code is collected and generalized by hytzongxuan (hytzongxuan@gmail.com)
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <iostream>
+#include <cstring>
+#include <cstdio>
+#include <list>
+#include <map>
+
+#define BUF_SIZE 1024
+using namespace std;
+
+string PID[50];
+int tot;
+
+class WindowsMatchingPid
+{
+  public:
+    WindowsMatchingPid(Display *display, Window wRoot, unsigned long pid)
+        : _display(display), _pid(pid)
+    {
+        _atomPID = XInternAtom(display, "_NET_WM_PID", True);
+        if (_atomPID == None)
+        {
+            cout << "No such atom" << endl;
+            return;
+        }
+
+        search(wRoot);
+    }
+
+    const list<Window> &result() const { return _result; }
+
+  private:
+    unsigned long _pid;
+    Atom _atomPID;
+    Display *_display;
+    list<Window> _result;
+
+    void search(Window w)
+    {
+        Atom type;
+        int format;
+        unsigned long nItems;
+        unsigned long bytesAfter;
+        unsigned char *propPID = 0;
+        if (Success == XGetWindowProperty(_display, w, _atomPID, 0, 1, False, XA_CARDINAL,
+                                          &type, &format, &nItems, &bytesAfter, &propPID))
+        {
+            if (propPID != 0)
+            {
+                if (_pid == *((unsigned long *)propPID))
+                    _result.push_back(w);
+
+                XFree(propPID);
+            }
+        }
+
+        Window wRoot;
+        Window wParent;
+        Window *wChild;
+        unsigned nChildren;
+        if (0 != XQueryTree(_display, w, &wRoot, &wParent, &wChild, &nChildren))
+        {
+            for (unsigned i = 0; i < nChildren; i++)
+                search(wChild[i]);
+        }
+    }
+};
+
+void getPidByName(char *task_name)
+{
+    DIR *dir;
+    struct dirent *ptr;
+    FILE *fp;
+    char filepath[50];
+    char cur_task_name[50];
+    char buf[BUF_SIZE];
+
+    dir = opendir("/proc");
+
+    if (NULL != dir)
+    {
+        while ((ptr = readdir(dir)) != NULL)
+        {
+
+            if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
+                continue;
+            if (DT_DIR != ptr->d_type)
+                continue;
+
+            sprintf(filepath, "/proc/%s/status", ptr->d_name);
+            fp = fopen(filepath, "r");
+
+            if (NULL != fp)
+            {
+                if (fgets(buf, BUF_SIZE - 1, fp) == NULL)
+                {
+                    fclose(fp);
+                    continue;
+                }
+                sscanf(buf, "%*s %s", cur_task_name);
+
+                if (!strcmp(task_name, cur_task_name))
+                {
+                    PID[++tot] = ptr->d_name;
+                }
+
+                fclose(fp);
+            }
+        }
+        closedir(dir);
+    }
+}
+
+struct CloudMusicWindow
+{
+    Window window;
+    int height, width;
+
+    CloudMusicWindow() {}
+    CloudMusicWindow(Window _win, int _h, int _w)
+    {
+        window = _win;
+        height = _h;
+        width = _w;
+    }
+};
+
+CloudMusicWindow cloudmusicwindow[50];
+map<pair<int, int>, int> Map;
+int window_cnt;
+
+void findWindow(string x)
+{
+    int pid = atoi(x.c_str());
+
+    Display *display = XOpenDisplay(0);
+
+    WindowsMatchingPid match(display, XDefaultRootWindow(display), pid);
+
+    const list<Window> &result = match.result();
+    for (list<Window>::const_iterator it = result.begin(); it != result.end(); it++)
+    {
+        XWindowAttributes attrs;
+        XGetWindowAttributes(display, (*it), &attrs);
+
+        Map[make_pair(attrs.height, attrs.width)]++;
+        cloudmusicwindow[++window_cnt] = CloudMusicWindow((*it), attrs.height, attrs.width);
+    }
+}
+
+int main(int argc, char **argv)
+{
+    Display *display;
+    Window window;
+    XEvent event;
+    int s;
+
+    display = XOpenDisplay(NULL);
+    if (display == NULL)
+    {
+        fprintf(stderr, "Cannot open display\n");
+        exit(1);
+    }
+
+    getPidByName("cloudmusic.exe");
+
+    for (register int i = 1; i <= tot; i++)
+    {
+        findWindow(PID[i]);
+    }
+
+    s = DefaultScreen(display);
+
+    window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 1, 1, 1,
+                                 BlackPixel(display, s), WhitePixel(display, s));
+
+    XSelectInput(display, window, ExposureMask | KeyPressMask);
+
+    XMapWindow(display, window);
+
+    for (register int i = 1; i <= window_cnt; i++)
+    {
+        if (Map[make_pair(cloudmusicwindow[i].height, cloudmusicwindow[i].width)] == 2)
+        {
+            XReparentWindow(display, cloudmusicwindow[i].window, window, 1, 1);
+        }
+    }
+
+    XCloseDisplay(display);
+    return 0;
+}
\ No newline at end of file