获得QQ聊天输入框中的内容
// 首先得到输入框的句柄。通过spy++这类工具分析,聊天窗体的类名为“#32770”
// 但当前系统里不只一个类名为“#32770”的窗体,这就需要全体遍历一次。
// 类名为“#32770”标题含“聊天”基本能确定。为保险起见还判断一下所在进程是否为“qq.exe”
uses PsAPI, RichEdit;
function Process_ReadRichEditText(AHandle: THandle): WideString;
var
vGetTextEx: GETTEXTEX;
vGetTextLengthEx: GETTEXTLENGTHEX;
L: Integer;
vProcessId: DWORD;
vProcess: THandle;
vPointer: Pointer;
vNumberOfBytesRead: Cardinal;
begin
Result := '';
if not IsWindow(AHandle) then Exit;
GetWindowThreadProcessId(AHandle, @vProcessId);
vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, vProcessId);
try
vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
PAGE_READWRITE);
vGetTextLengthEx.flags := GTL_DEFAULT;
vGetTextLengthEx.codepage := 1200; // Unicode
WriteProcessMemory(vProcess, vPointer, @vGetTextLengthEx,
SizeOf(vGetTextLengthEx), vNumberOfBytesRead);
L := SendMessage(AHandle, EM_GETTEXTLENGTHEX, Integer(vPointer), 0);
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
if L <= 0 then Exit;
vPointer := VirtualAllocEx(vProcess, nil, SizeOf(vGetTextEx) + L * 2 + 2,
MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
SetLength(Result, L);
vGetTextEx.cb := L * 2 + 2;
vGetTextEx.flags := GT_DEFAULT;
vGetTextEx.codepage := 1200; // Unicode
vGetTextEx.lpDefaultChar := nil;
vGetTextEx.lpUsedDefChar := nil;
WriteProcessMemory(vProcess, vPointer, @vGetTextEx,
SizeOf(vGetTextEx), vNumberOfBytesRead);
SendMessage(AHandle, EM_GETTEXTEX, Integer(vPointer),
Integer(vPointer) + SizeOf(vGetTextEx));
ReadProcessMemory(vProcess, Pointer(Integer(vPointer) + SizeOf(vGetTextEx)),
@Result[1], L * 2, vNumberOfBytesRead);
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
finally
CloseHandle(vProcess);
end;
end; { Process_ReadRichEditText }
function GetProcessName(AProcessID: THandle): string;
var
vBuffer: array[0..MAX_PATH] of Char;
vProcess: THandle;
begin
vProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,
AProcessID);
try
if GetModuleBaseName(vProcess, 0, vBuffer, SizeOf(vBuffer)) > 0 then
Result := vBuffer
else Result := '';
finally
CloseHandle(vProcess);
end;
end; { GetProcessName }
function EnumChild(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
vBuffer: array[0..255] of Char;
begin
Result := True;
if not IsWindowVisible(hwnd) then Exit; // 不可见
GetClassName(hwnd, vBuffer, SizeOf(vBuffer));
if SameText(vBuffer, 'RichEdit20A') then
begin
if GetWindowLong(hwnd, GWL_STYLE) and ES_READONLY <> ES_READONLY then // 非只读
begin
PInteger(lParam)^ := hwnd;
Result := False;
end;
end;
end; { EnumChild }
function EnumFunc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
vBuffer: array[0..255] of Char;
vProcessId: THandle;
begin
Result := True;
if not IsWindowVisible(hwnd) then Exit; // 不可见
GetClassName(hwnd, vBuffer, SizeOf(vBuffer));
if SameText(vBuffer, '#32770') then
begin
GetWindowThreadProcessId(hwnd, vProcessId);
if SameText(GetProcessName(vProcessId), 'qq.exe') then
begin
GetWindowText(hwnd, vBuffer, SizeOf(vBuffer));
if Pos('聊天中', vBuffer) > 0 then // 标题中含"聊天中"
begin
EnumChildWindows(hwnd, @EnumChild, lParam);
Result := False;
end;
end;
end;
end; { EnumFunc }
procedure TForm1.Button1Click(Sender: TObject);
var
vHandle: THandle;
begin
vHandle := 0;
EnumWindows(@EnumFunc, Integer(@vHandle));
if vHandle = 0 then Exit;
Memo1.Text := Process_ReadRichEditText(vHandle);
end;
 using System.Runtime.InteropServices;
using System.Runtime.InteropServices;
 [DllImport("User32.DLL")]
[DllImport("User32.DLL")] public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);
public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);
 [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern int EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);
public static extern int EnumWindows(WNDENUMPROC lpEnumFunc, int lParam); [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern int EnumChildWindows(IntPtr hWndParent,
public static extern int EnumChildWindows(IntPtr hWndParent,  WNDENUMPROC lpEnumFunc, int lParam);
    WNDENUMPROC lpEnumFunc, int lParam); [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString,
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    int nMaxCount); [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
    int nMaxCount); [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern bool IsWindow(IntPtr hWnd);
public static extern bool IsWindow(IntPtr hWnd); [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd);
public static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.DLL")]
[DllImport("user32.DLL")] public static extern IntPtr FindWindowEx(IntPtr hwndParent,
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd,
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint dwProcessId);
    out uint dwProcessId);
 [DllImport("psapi.dll")]
[DllImport("psapi.dll")] public static extern uint GetModuleBaseName(IntPtr hProcess, IntPtr hModule,
public static extern uint GetModuleBaseName(IntPtr hProcess, IntPtr hModule, StringBuilder lpBaseName, uint nSize);
    StringBuilder lpBaseName, uint nSize);
 public const uint PROCESS_VM_OPERATION = 0x0008;
public const uint PROCESS_VM_OPERATION = 0x0008; public const uint PROCESS_VM_READ = 0x0010;
public const uint PROCESS_VM_READ = 0x0010; public const uint PROCESS_VM_WRITE = 0x0020;
public const uint PROCESS_VM_WRITE = 0x0020; public const uint PROCESS_QUERY_INFORMATION = 0x0400;
public const uint PROCESS_QUERY_INFORMATION = 0x0400;
 [DllImport("kernel32.dll")]
[DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(uint dwDesiredAccess,
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
    bool bInheritHandle, uint dwProcessId);
 [DllImport("kernel32.dll")]
[DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr handle);
public static extern bool CloseHandle(IntPtr handle);
 [DllImport("user32.dll")]
[DllImport("user32.dll")] public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
public static extern int GetWindowLong(IntPtr hWnd, int nIndex); public const int GWL_STYLE = -16;
public const int GWL_STYLE = -16; public const int ES_READONLY = 0x800;
public const int ES_READONLY = 0x800;
 public const uint MEM_COMMIT = 0x1000;
public const uint MEM_COMMIT = 0x1000; public const uint MEM_RELEASE = 0x8000;
public const uint MEM_RELEASE = 0x8000;
 public const uint MEM_RESERVE = 0x2000;
public const uint MEM_RESERVE = 0x2000; public const uint PAGE_READWRITE = 4;
public const uint PAGE_READWRITE = 4;
 [DllImport("kernel32.dll")]
[DllImport("kernel32.dll")] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress,
public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
    uint dwSize, uint flAllocationType, uint flProtect);
 [DllImport("kernel32.dll")]
[DllImport("kernel32.dll")] public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress,
public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint dwFreeType);
   uint dwSize, uint dwFreeType);
 [DllImport("kernel32.dll")]
[DllImport("kernel32.dll")] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);
   IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);
 [DllImport("kernel32.dll")]
[DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);
   IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead); 
 private IntPtr richHandle;
private IntPtr richHandle;
 public string GetProcessName(uint AProcessId)
public string GetProcessName(uint AProcessId) {
{ StringBuilder vBuffer = new StringBuilder(256);
    StringBuilder vBuffer = new StringBuilder(256); IntPtr vProcess = OpenProcess(
    IntPtr vProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, AProcessId);
        PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, AProcessId); try
    try {
    { if (GetModuleBaseName(vProcess, IntPtr.Zero, vBuffer,
        if (GetModuleBaseName(vProcess, IntPtr.Zero, vBuffer,  (uint)vBuffer.Capacity) > 0)
            (uint)vBuffer.Capacity) > 0) return vBuffer.ToString();
            return vBuffer.ToString(); else return string.Empty;
        else return string.Empty; }
    } finally
    finally {
    { CloseHandle(vProcess);
        CloseHandle(vProcess); }
    } }
}
 public bool EnumChild(IntPtr hwnd, int lParam)
public bool EnumChild(IntPtr hwnd, int lParam) {
{ if (!IsWindowVisible(hwnd)) return true; // 不可见
    if (!IsWindowVisible(hwnd)) return true; // 不可见 StringBuilder vBuffer = new StringBuilder(256);
    StringBuilder vBuffer = new StringBuilder(256); GetClassName(hwnd, vBuffer, vBuffer.Capacity);
    GetClassName(hwnd, vBuffer, vBuffer.Capacity); if (vBuffer.ToString().ToLower() == "richedit20a")
    if (vBuffer.ToString().ToLower() == "richedit20a") {
    { if ((GetWindowLong(hwnd, GWL_STYLE) & ES_READONLY) != ES_READONLY) // 非只读
        if ((GetWindowLong(hwnd, GWL_STYLE) & ES_READONLY) != ES_READONLY) // 非只读 {
        { richHandle = hwnd;
            richHandle = hwnd; return false;
            return false; }
        } }
    } return true;
    return true; }
}
 public bool EnumFunc(IntPtr hwnd, int lParam)
public bool EnumFunc(IntPtr hwnd, int lParam) {
{ if (!IsWindowVisible(hwnd)) return true; // 不可见
    if (!IsWindowVisible(hwnd)) return true; // 不可见 StringBuilder vBuffer = new StringBuilder(256);
    StringBuilder vBuffer = new StringBuilder(256); GetClassName(hwnd, vBuffer, vBuffer.Capacity);
    GetClassName(hwnd, vBuffer, vBuffer.Capacity); if (vBuffer.ToString() == "#32770")
    if (vBuffer.ToString() == "#32770") {
    { uint vProcessId;
        uint vProcessId; GetWindowThreadProcessId(hwnd, out vProcessId);
        GetWindowThreadProcessId(hwnd, out vProcessId); if (GetProcessName(vProcessId).ToLower() == "qq.exe")
        if (GetProcessName(vProcessId).ToLower() == "qq.exe") {
        { GetWindowText(hwnd, vBuffer, vBuffer.Capacity);
            GetWindowText(hwnd, vBuffer, vBuffer.Capacity); if (vBuffer.ToString().IndexOf("聊天中") >= 0) // 标题中含"聊天中"
            if (vBuffer.ToString().IndexOf("聊天中") >= 0) // 标题中含"聊天中" {
            { EnumChildWindows(hwnd, @EnumChild, lParam);
                EnumChildWindows(hwnd, @EnumChild, lParam); return false;
                return false; }
            } }
        } }
    } return true;
    return true; }
}
 [StructLayout(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)] public struct GETTEXTLENGTHEX
public struct GETTEXTLENGTHEX {
{ public uint flags;
    public uint flags; public uint codepage;
    public uint codepage; }
}
 [StructLayout(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)] public struct GETTEXTEX
public struct GETTEXTEX {
{ public int cb;
    public int cb; public int flags;
    public int flags; public int codepage;
    public int codepage; public IntPtr lpDefaultChar;
    public IntPtr lpDefaultChar; public IntPtr lpUsedDefChar;
    public IntPtr lpUsedDefChar; };
};
 public const int GTL_DEFAULT = 0;
public const int GTL_DEFAULT = 0; public const int GT_DEFAULT = 0;
public const int GT_DEFAULT = 0; public const int WM_USER = 0x0400;
public const int WM_USER = 0x0400; public const int EM_GETTEXTEX = WM_USER + 94;
public const int EM_GETTEXTEX = WM_USER + 94;  public const int EM_GETTEXTLENGTHEX = WM_USER + 95;
public const int EM_GETTEXTLENGTHEX = WM_USER + 95;
 public string Process_ReadRichEditText(IntPtr AHandle)
public string Process_ReadRichEditText(IntPtr AHandle) {
{ if (!IsWindow(AHandle)) return string.Empty;
    if (!IsWindow(AHandle)) return string.Empty; string vReturn = string.Empty;
    string vReturn = string.Empty; uint vProcessId;
    uint vProcessId; GetWindowThreadProcessId(AHandle, out vProcessId);
    GetWindowThreadProcessId(AHandle, out vProcessId); IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
    IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, vProcessId);
        PROCESS_VM_WRITE, false, vProcessId); try
    try {
    { uint vNumberOfBytesRead = 0;
        uint vNumberOfBytesRead = 0; IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 0x1000,
        IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 0x1000,  MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
            MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); GETTEXTLENGTHEX vGetTextLengthEx = new GETTEXTLENGTHEX();
        GETTEXTLENGTHEX vGetTextLengthEx = new GETTEXTLENGTHEX(); vGetTextLengthEx.flags = GTL_DEFAULT;
        vGetTextLengthEx.flags = GTL_DEFAULT; vGetTextLengthEx.codepage = 1200; // Unicode
        vGetTextLengthEx.codepage = 1200; // Unicode IntPtr vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vGetTextLengthEx));
        IntPtr vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vGetTextLengthEx)); Marshal.StructureToPtr(vGetTextLengthEx, vAddress, false);
        Marshal.StructureToPtr(vGetTextLengthEx, vAddress, false); WriteProcessMemory(vProcess, vPointer, vAddress,
        WriteProcessMemory(vProcess, vPointer, vAddress, Marshal.SizeOf(vGetTextLengthEx), ref vNumberOfBytesRead);
            Marshal.SizeOf(vGetTextLengthEx), ref vNumberOfBytesRead); Marshal.FreeCoTaskMem(vAddress);
        Marshal.FreeCoTaskMem(vAddress); int L = SendMessage(AHandle, EM_GETTEXTLENGTHEX, (int)vPointer, 0);
        int L = SendMessage(AHandle, EM_GETTEXTLENGTHEX, (int)vPointer, 0); VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); if (L <= 0) return vReturn;
        if (L <= 0) return vReturn; GETTEXTEX vGetTextEx = new GETTEXTEX();
        GETTEXTEX vGetTextEx = new GETTEXTEX(); vGetTextEx.cb = L * 2 + 2;
        vGetTextEx.cb = L * 2 + 2; vGetTextEx.flags = GT_DEFAULT;
        vGetTextEx.flags = GT_DEFAULT; vGetTextEx.codepage = 1200; // Unicode
        vGetTextEx.codepage = 1200; // Unicode vGetTextEx.lpDefaultChar = IntPtr.Zero;
        vGetTextEx.lpDefaultChar = IntPtr.Zero; vGetTextEx.lpUsedDefChar = IntPtr.Zero;
        vGetTextEx.lpUsedDefChar = IntPtr.Zero; vPointer = VirtualAllocEx(vProcess, IntPtr.Zero,
        vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, (uint)(Marshal.SizeOf(vGetTextEx) + L * 2 + 2),
            (uint)(Marshal.SizeOf(vGetTextEx) + L * 2 + 2), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
            MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vGetTextEx));
        vAddress = Marshal.AllocCoTaskMem(Marshal.SizeOf(vGetTextEx)); Marshal.StructureToPtr(vGetTextEx, vAddress, false);
        Marshal.StructureToPtr(vGetTextEx, vAddress, false); WriteProcessMemory(vProcess, vPointer, vAddress,
        WriteProcessMemory(vProcess, vPointer, vAddress, Marshal.SizeOf(vGetTextEx), ref vNumberOfBytesRead);
            Marshal.SizeOf(vGetTextEx), ref vNumberOfBytesRead); Marshal.FreeCoTaskMem(vAddress);
        Marshal.FreeCoTaskMem(vAddress); SendMessage(AHandle, EM_GETTEXTEX, (int)vPointer,
        SendMessage(AHandle, EM_GETTEXTEX, (int)vPointer, (int)vPointer + Marshal.SizeOf(vGetTextEx));
            (int)vPointer + Marshal.SizeOf(vGetTextEx)); vAddress = Marshal.AllocCoTaskMem(L * 2);
        vAddress = Marshal.AllocCoTaskMem(L * 2); ReadProcessMemory(vProcess,
        ReadProcessMemory(vProcess,  (IntPtr)((int)vPointer + Marshal.SizeOf(vGetTextEx)),
            (IntPtr)((int)vPointer + Marshal.SizeOf(vGetTextEx)), vAddress, L * 2, ref vNumberOfBytesRead);
            vAddress, L * 2, ref vNumberOfBytesRead); vReturn = Marshal.PtrToStringUni(vAddress, L * 2);
        vReturn = Marshal.PtrToStringUni(vAddress, L * 2); Marshal.FreeCoTaskMem(vAddress);
        Marshal.FreeCoTaskMem(vAddress); VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); }
    } finally
    finally {
    { CloseHandle(vProcess);
        CloseHandle(vProcess); }
    } return vReturn;
    return vReturn; }
}
 private void button1_Click(object sender, EventArgs e)
private void button1_Click(object sender, EventArgs e) {
{ richHandle = IntPtr.Zero;
    richHandle = IntPtr.Zero; EnumWindows(EnumFunc, 0);
    EnumWindows(EnumFunc, 0); if (richHandle == IntPtr.Zero) return;
    if (richHandle == IntPtr.Zero) return; Console.WriteLine(Process_ReadRichEditText(richHandle));
    Console.WriteLine(Process_ReadRichEditText(richHandle)); }
} 
获得QQ聊天输入框中的内容的更多相关文章
- 屏蔽QQ聊天对话框中的广告
		原文地址: 怎么在QQ聊天对话框中屏蔽广告_百度经验 http://jingyan.baidu.com/article/48a42057ca12c1a924250402.html QQ已经成为 ... 
- Javascript 对输入框中的内容进行 “全选/反选”
		<</span>script> document.write("<</span>ul>"); for(var i=0;i<&l ... 
- vue时时监听input输入框中 输入内容  写法
		Vue input 监听 使用 v-on:input="change" 实现即可 App.vue <template> <div> <md-field ... 
- JS简单仿QQ聊天工具的制作
		刚接触JS,对其充满了好奇,利用刚学到的一点知识,写了一个简单的仿QQ聊天的东西,其中还有很多的不足之处,有待慢慢提高. 功能:1.在输入框中输入内容,点击发送,即可在上方显示所输入内容. 2.点击‘ ... 
- Web聊天应用中的表情插件
		聊天应用中的表情插件 用于即时聊天应用的图片表情插件,具有展示表情.插入表情和表情编解码的功能 项目地址 看代码 看demo 原理介绍 web端的即时聊天中看到的表情,其实就是一张张表情图片,通过im ... 
- 输入框中的空"",0,null的判断
		改了一个小项目,里面有一个小的问题他们是这样提需求的.两个输入框,第一个输入框里面,输入的内容会对第二个输入框中的内容产生影响.具体是这样的:如果第一个输入框中的值不是“0”,那么第二个输入框就不能填 ... 
- 八、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框扩展面板的实现
		聊天输入框扩展面板的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入 ... 
- 在WEB项目中调用QQ通讯组件打开QQ聊天界面
		在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ... 
- QQ聊天气泡(图片拉伸不变样)、内容尺寸定制(高度随字数、字体而变)
		- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; /** QQ聊 ... 
随机推荐
- 【24.58%】【BZOJ 1001】狼抓兔子
			Time Limit: 15 Sec Memory Limit: 162 MB Submit: 19227 Solved: 4726 [Submit][Status][Discuss] Descrip ... 
- 深入Lazy<T>——.NET Framework 4.0
			.NET Framework 4 在一次次跳票中终于发布了,在一次偶然的机会,我看到了 Anytao 的 [你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T>点滴 . ... 
- vim note (2)
			:e edit :edit edit :e. edit current file '.' a dot is means current : w writ ... 
- Residential Gateway System for Home Network Service
			Disclosed herein is a Residential Gateway (RG) system for home network service. The RG system receiv ... 
- Android菜鸟的成长笔记(20)——IntentService
			前面介绍的Service在官方文档介绍中说Service存在着如下两个问题: 1.A Service is not a separate process. The Service object its ... 
- OpenVZ安装指南,一种操作系统级别的虚拟化技术
			鼎鼎大名的 OpenVZ 谁不知道?在主机行业被使用(滥用)很多年,依然在茁壮发展.作为一种操作系统级别的虚拟化技术,运行 OpenVZ 没有硬性的硬件要求.OpenVZ 能够创建被称为容器(cont ... 
- ADO.NET - 批量更新或添加数据
			方法一:使用SqlBulkCopy实现批量更新或添加数据. SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加 ... 
- WinForm - 窗体淡入效果界面的简单实现方法
			WinForm窗体淡入效果主要使用到控件的Opacity属性 首先在WinForm窗体中拖入一个Timer控件,然后再Timer控件的Tick事件添加如下代码: private void timer1 ... 
- 【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
			转自:https://www.cnblogs.com/stevenluo/p/6030445.html 微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热 ... 
- EPI_H/EPI_V(边缘保持指数,matlab 矢量化编程)
			EPI: edge preservation index,衡量对原始图像的操作(目标图像)对图像边缘的保持能力. EPI_H:horizontal ,水平方向: EPI_V:vertical,垂直方向 ... 
