Many people should know that QQ's child window handle is not available in the Winuser library function can be obtained,
because there is no nativehandle it is the logical control of painting Directui, WPF, but Directui
and not as WPF pure DirectX rendering frame, but the two concepts are equal, the control is only logically not true
the positive meaning of the existence in the control, since there is no way to get its content, very simple Microsoft provides two sets of different
class Library, C + + main application Microsoft Active Accessibility / MSAA You don't think it's a game.
MSAA/antialiasing, you can also use the UI Automation /UI Automation, C # primarily uses UIA, but
. NET , if a native UIAutomationCore.dll is needed in the. NET upper -level com wrapper
class Library is,interop.uiautomationclient , but the meaning of the two is not big, . NET upper wrapper class library just
the performance is not as fast as the native, you choose that . all the same, if you're interested, you can check it out. Windows Automation API
Above is just a running result, the software has been successfully obtained to chat record
Speed is not fast, add project references first
UIAutomationClient.dll and UIAutomationTypes.dll two bullets,
OK to confirm the reference and then add the namespace reference,
Using System; Using System.Text; Using System.Windows.Automation; Using System.Runtime.InteropServices; Using System.Collections.Generic; Using System.Windows.Forms;
First, we need to declare the win32native functions and constants that we need to use.
Public abstract partial class win32native{[DllImport ("User32.dll")] [Return:marshalas (Unmanagedtype.bool)] Priv Ate static extern bool EnumWindows (lpenumwindowsproc lpenumfunc, int lParam); [DllImport ("user32.dll", CharSet = CharSet.Ansi)] [Return:marshalas (Unmanagedtype.bool)] private static extern Bool getclassname (int hWnd, StringBuilder buf, int Nmaxco UNT); [DllImport ("user32.dll", CharSet = CharSet.Auto, SetLastError = True)] [Return:marshalas (Unmanagedtype.bool)] private static extern Bool GetWindowText (int hWnd, StringBuilder lpstring, int nMaxCount); [DllImport ("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern int Getwindowtextlength (in T hWnd); [DllImport ("User32.dll")] [Return:marshalas (Unmanagedtype.bool)] public static extern Bool IsWindow (IntPtr hWnd); Private delegate bool Lpenumwindowsproc (int hwnd, int lParam); public const int NULL = 0; Private Const int maxbyte = 255;}
Below we write a scan on the desktop how many QQ top-level windows code,
we're not going to scan the merged window. you just need to scan the top-level window.
public abstract partial class win32native{private static volatile list<int> hWnd Collect; private static bool Scansessionwindow (int hwnd, int lParam) {StringBuilder buf = new StringBuilder (maxbyte); if (GetClassName (hwnd, BUF, Maxbyte) && buf. ToString () = = "Txguifoundation") if (Getwindowtextlength (HWND) > 0 && GetWindowText (hwnd, BUF, Maxby TE)) {string str = buf. ToString (); if (str! = "Txmenuwindow" && str! = "QQ" && str = "Increase duration") {Console.wri Teline ("\ T" + (Hwndcollect.count + 1) + ":" + str); Hwndcollect.add (HWND); }} return true; } public static int[] Getsessionwindow () {hwndcollect = new list<int> (); EnumWindows (Scansessionwindow, NULL); return Hwndcollect.toarray (); }}
I've added a couple of conditions up there that have been removed and may be enumerated
But to our meaningless window,
Getsessionwindow/Fetch Session window
Sansessionwindow/Scan Session window
public static partial class program{ private static void Findusermessage (INTPTR hwnd) { if (! Win32native.iswindow (HWND)) Console.WriteLine ("QQ Session window has been closed."); else { automationelement element = Automationelement.fromhandle (hwnd); element = element. FindFirst (treescope.descendants, New PropertyCondition (Automationelement.nameproperty, "message")); if (element! = null && element. current.isenabled) { ValuePattern Vptextedit = element. Getcurrentpattern (Valuepattern.pattern) as ValuePattern; if (vptextedit! = null) { string value = VpTextEdit.Current.Value; Console.WriteLine (value); MessageBox.Show (value);}}}}
Findusermessage/Find User messages
in the above we see first do a check whether the window handle is valid if valid in the following
Created a automationelement/Automation member object, if we need to
Search and return a single member, then we only need to use FindFirst if we need to
Search and return all members, then we just need to use FindAll, we're on top
Use only one name attribute condition PropertyCondition (automationelement.nameproperty, "message")
Why the news, then let's take a closer look
Well, you should find out now why it's "news" and not the other, right?
public static partial class program{ [STAThread] private static void Main (string[] args) { Console.title = string. Empty; Console.WriteLine ("Scan the QQ User's session window."); int[] hwndofsession = Win32native.getsessionwindow (); if (hwndofsession.length <= 0) Console.WriteLine ("No Scan to any available QQ message window."); else { Console.WriteLine ("Look for the session record interface."); foreach (int hwnd in hwndofsession) findusermessage ((INTPTR) HWND); } Console.WriteLine ("Thank you for using, QQ conversations has been scanned."); Console.readkey (false);} }
The code above is about stitching together a couple of functions to accomplish what we need to do. first get on the desktop there
How many QQ draw the word handle, and then iterate to find the user message, in fact, if it can be placed in the
start scanning on the computer. Send to your own mailbox or update to the server will be a good
Play of the things, but the premise that you must be able to get it to someone else's computer, a little joke .
Want to catch husband cheating evidence rich, hehe, mobile version may be able to save her,
Source code: Http://pan.baidu.com/s/1kTBxOdL
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
C # take QQ session record