1. 程式人生 > >Windows API之FindWindow和FindWindowEx函式

Windows API之FindWindow和FindWindowEx函式

1 FindWindow函式:
函式功能:該函式獲得一個頂層視窗的控制代碼,該視窗的類名和視窗名與給定的字串相匹配。這個函式不查詢子視窗。在查詢時不區分大小寫。
函式型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
引數:
IpClassName :指向一個指定了類名的空結束字串,或一個標識類名字串的成員的指標。如果該引數為一個成員,則它必須為前次呼叫theGlobafAddAtom函式產生的全域性成員。該成員為16位,必須位於IpClassName的低 16位,高位必須為 0。
IpWindowName:指向一個指定了視窗名(視窗標題)的空結束字串。如果該引數為空,則為所有視窗全匹配。
返回值:如果函式成功,返回值為具有指定類名和視窗名的視窗控制代碼;如果函式失敗,返回值為NULL
2 FindWindowEx函式:
函式功能:該函式獲得一個視窗的控制代碼,該視窗的類名和視窗名與給定的字串相匹配。這個函式查詢子視窗,從排在給定的子視窗後面的下一個子視窗開始。在查詢時不區分大小寫。
函式原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
引數:
hwndParent:要查詢子視窗的父視窗控制代碼。
如果hwnjParent為NULL,則函式以桌面視窗為父視窗,查詢桌面視窗的所有子視窗。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函式僅查詢所有訊息視窗。
hwndChildAfter :子視窗控制代碼。查詢從在Z序中的下一個子視窗開始。子視窗必須為hwndPareRt視窗的直接子視窗而非後代視窗。如果HwndChildAfter為NULL,查詢從hwndParent的第一個子視窗開始。如果hwndParent 和 hwndChildAfter同時為NULL,則函式查詢所有的頂層視窗及訊息視窗。
lpszClass:指向一個指定了類名的空結束字串,或一個標識類名字串的成員的指標。如果該引數為一個成員,則它必須為前次呼叫theGlobaIAddAtom函式產生的全域性成員。該成員為16位,必須位於lpClassName的低16位,高位必須為0。
lpszWindow:指向一個指定了視窗名(視窗標題)的空結束字串。如果該引數為 NULL,則為所有視窗全匹配。返回值:如果函式成功,返回值為具有指定類名和視窗名的視窗控制代碼。如果函式失敗,返回值為NULL。
3名稱空間 :
using System.Runtime.InteropServices;
4程式設計例項:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
        static
extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)] extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll"
, EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam); [STAThread] static void Main(string[] args) { const int BM_CLICK = 0xF5; IntPtr maindHwnd = FindWindow(null, "QQ"); //獲得QQ登陸框的控制代碼 if (maindHwnd != IntPtr.Zero) { IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登入"); //獲得按鈕的控制代碼 if (childHwnd != IntPtr.Zero) { Console.WriteLine("找到子視窗"+childHwnd); SendMessage(childHwnd, BM_CLICK, IntPtr.Zero, null); //傳送點選按鈕的訊息 } else { Console.WriteLine("沒有找到子視窗"); } } else { Console.WriteLine("沒有找到視窗"); } Console.ReadKey(); }

經過除錯可得上面的子視窗的控制代碼好像獲取不到,不知道什麼原因,但是呢,在自己建立的winfrom程式中是可以獲取裡面的按鈕的控制代碼的。一定要記住我們可以通過工作管理員來獲取我們開啟的視窗名稱,按鈕就是名稱,不是它的變數名稱。