想当初,腾讯 QQ 拥有一个叫做“付费加群”的功能。群里的老哥为了给自己的软件做授权探索出了一个骚操作:软件启动时扫描本机登录的 QQ 号码,并与服务端的群成员进行对比。如果 QQ 号在群里,则表明授权,如果不在则代表未授权。
听完老哥的介绍笔者直呼内行,其核心逻辑也被读者拿到:(PS:付费加群功能早已下线)
[DllImport("User32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] public extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.dll", EntryPoint = "GetWindowText", CharSet = CharSet.Auto)] public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int nMaxCount); [DllImport("User32.dll", EntryPoint = "GetWindow", CharSet = CharSet.Auto)] public static extern IntPtr GetWindow(IntPtr hwnd, int GW_HWNDNEXT); public static List<string> GetQQNumber(bool type = false) { IntPtr fw; if (type) { fw = FindWindow(null, "QQ"); } else { fw = FindWindow("CTXOPConntion_Class", null); } if (fw != IntPtr.Zero) { List<string> ret = new List<string>(); StringBuilder sb = new StringBuilder(512); string qq; int len; do { len = GetWindowText(fw, sb, 512); if (len > 0) { qq = Convert.ToString(sb); // Console.WriteLine(qq); if (qq.Contains("OP_") || qq.Contains("_32856F50-AA9A-4388-A3C1-AE5C00A61C43")) { ret.Add(qq.Replace("_32856F50-AA9A-4388-A3C1-AE5C00A61C43", string.Empty)); } } fw = GetWindow(fw, 2); sb.Clear(); } while (fw != IntPtr.Zero); if (ret.Count > 0) { return ret; } else { return null; } } else { return null; } }
以上代码的核心原理就是遍历窗口,获取窗口标题。
使用方式就是调用 GetQQNumber 方法。
当传入的参数为 false 时,方法的效率较高,会返回固定的“OP_”前缀和号码。
当传入的参数为 true 时,方法的效率较低,会返回客户端类型和号码。如:TIM_261081XXX
或 QQ_571595XXX
。
再次感谢群里老哥的分享,奇怪的知识又增加了。
不错,还能取得tim的QQ号