想当初,腾讯 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号