C#操作窗口類句柄操作_第1頁
C#操作窗口類句柄操作_第2頁
C#操作窗口類句柄操作_第3頁
C#操作窗口類句柄操作_第4頁
C#操作窗口類句柄操作_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C*寫個類操作窗口〔句柄操作〕實現過程:過程一:找到當前鼠標位置的句柄您的使用2個WinAPI〔俺喜歡自己封裝下來用〕:ViewCode[DllImport("user32.dll",EntryPoint="GetCursorPos")]

publicstatice*ternboolGetCursorPos(outPointpt);

[DllImport("user32.dll",EntryPoint="WindowFromPoint")]

publicstatice*ternIntPtrWindowFromPoint(Pointpt);

//鼠標位置的坐標

publicstaticPointGetCursorPosPoint()

{

Pointp=newPoint();

if(GetCursorPos(outp))

{

returnp;

}

returndefault(Point);

}

///<summary>///找到句柄

///</summary>///<paramname="p">坐標</param>///<returns></returns>

publicstaticIntPtrGetHandle(Pointp)

{

returnWindowFromPoint(p);

}過程二:改變窗口的Te*t您的使用1個WinAPI:ViewCode[DllImport("user32.dll",EntryPoint="SendMessage")]

privatestatice*ternintSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,stringlParam);

///<summary>///給窗口發(fā)送容

///</summary>///<paramname="hWnd">句柄</param>///<paramname="lParam">要發(fā)送的容</param>

publicstaticvoidSetTe*t(IntPtrhWnd,stringlParam)

{

SendMessage(hWnd,WM_SETTE*T,IntPtr.Zero,lParam);

}

privateconstintWM_SETTE*T=0*000C;通過這個方法就能改變Te*t的值了。思考:如果俺把這個窗口的句柄記錄下來,下次不用鼠標獲取,直接就能改變值不蠻好的嘛。例如:我有個桌面系統(tǒng)老叫我輸入用戶名,密碼。我記錄用戶名和密碼的窗口句柄,然后改變他們的輸入值,這樣多省事?!仓皇桥e例,不考慮平安性〕問題:你會告訴我,窗口句柄的每次重建會變的呀,咋辦。答復:類名不變呀。過程三:您的準備一些工具吧,例如:句柄找類名呀,類名找句柄什么的等等,下面會用到一些WinAPIViewCode[DllImport("user32.dll",EntryPoint="FindWindow")]

privatestatice*ternIntPtrFindWindow(stringIpClassName,stringIpWindowName);

[DllImport("user32.dll",EntryPoint="FindWindowE*")]

privatestatice*ternIntPtrFindWindowE*(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass,stringlpszWindow);

[DllImport("user32.dll",EntryPoint="GetParent")]

publicstatice*ternIntPtrGetParent(IntPtrhWnd);

[DllImport("user32.dll",CharSet=CharSet.Auto)]

publicstatice*ternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,intnMa*Count);

///<summary>///找到句柄

///</summary>///<paramname="IpClassName">類名</param>///<returns></returns>

publicstaticIntPtrGetHandle(stringIpClassName)

{

returnFindWindow(IpClassName,null);

}

///<summary>///子窗口句柄

///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="hwndChildAfter">前一個同目錄級同名窗口句柄</param>///<paramname="lpszClass">類名</param>///<returns></returns>

publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass)

{

returnFindWindowE*(hwndParent,hwndChildAfter,lpszClass,null);

}

///<summary>///全部子窗口句柄

///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="className">類名</param>///<returns></returns>

publicstaticList<IntPtr>GetChildHandles(IntPtrhwndParent,stringclassName)

{

List<IntPtr>resultList=newList<IntPtr>();

for(IntPtrhwndClient=GetChildHandle(hwndParent,IntPtr.Zero,className);hwndClient!=IntPtr.Zero;hwndClient=GetChildHandle(hwndParent,hwndClient,className))

{

resultList.Add(hwndClient);

}

returnresultList;

}

///<summary>///找類名

///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>

publicstaticstringGetClassName(IntPtrhWnd)

{

StringBuilderlpClassName=newStringBuilder(128);

if(GetClassName(hWnd,lpClassName,lpClassName.Capacity)==0)

{

thrownewE*ception("notfoundIntPtr!");

}

returnlpClassName.ToString();

}思考:遍歷桌面上所有的窗口,然后找類名,然后改他的Te*t,扯淡嘛,一樣的類名太多了,找毛呀。實現:不僅記錄類名,而且記錄類名在父窗口出現的位置,然后通過桌面一層層找下來,最后找到這個句柄。〔雖然不是太準,但是一般的還是能解決了,如果你有什么好方式一起研究〕。過程四:實現一個WinHWND的類,可以把他的規(guī)則,他的父窗口類名,以及在父窗口中同類名出現的順序記錄下來,然后通過這些記錄的信息復原句柄。ViewCodepublicclassWinHWND

{

publicIntPtrHWND{get;set;}

publicstringClassName{get;set;}

publicWinHWNDParent{get;set;}

publicintInParentSequence{get;set;}

privateWinHWND(){}

publicWinHWND(IntPtrhWnd)

{

this.HWND=hWnd;

this.ClassName=GetClassName();

this.Parent=GetParent();

this.InParentSequence=GetInParentSequence();

}

privatestringGetClassName()

{

returnWinAPI.GetClassName(this.HWND);

}

privateWinHWNDGetParent()

{

if(WinAPI.GetParent(this.HWND)==null)

{

thrownewE*ception("notfoundIntPtr!");

}

if(WinAPI.GetParent(this.HWND)==IntPtr.Zero)

{

returnnull;

}

returnnewWinHWND(WinAPI.GetParent(this.HWND));

}

privateintGetInParentSequence()

{

IntPtrIntprtParent=this.Parent==null"IntPtr.Zero:this.Parent.HWND;

returnWinAPI.GetChildHandles(IntprtParent,this.ClassName).Inde*Of(this.HWND);

}

publicoverridestringToString()

{

StringBuilderresult=newStringBuilder();

for(WinHWNDwinHandle=this;winHandle!=null;winHandle=winHandle.Parent)

{

result.Append(string.Format("{0}:{1};",Escape(winHandle.ClassName),winHandle.InParentSequence.ToString()));

if(winHandle.InParentSequence==-1)break;

}

returnresult.ToString().TrimEnd(';');

}

privatestaticstringGetBaseMark(stringsMark)

{

string[]sMarks=sMark.Split(';');

returnsMarks[sMarks.Length-1].Split(':')[0];

}

privatestaticstring[]GetChildMarks(stringsMark)

{

string[]sMarks=sMark.Split(';');

string[]sChildMarks=newstring[sMarks.Length-1];

for(inti=0;i<sChildMarks.Length;i++)

{

sChildMarks[i]=sMarks[i];

}

returnsChildMarks;

}

//我一直覺得這段寫很丑陋,誰能幫幫我改改

publicstaticWinHWNDGetWinHWND(stringsMark)

{

List<IntPtr>baseHwnds=WinAPI.GetChildHandles(IntPtr.Zero,GetBaseMark(sMark));

string[]sChildMarks=GetChildMarks(sMark);

//由于主窗口在桌面出現所以很可能同名,所以要看看他的兒子和子...是不是都匹配

foreach(IntPtrbaseHwndinbaseHwnds)

{

IntPtrhandle=baseHwnd;

for(inti=sChildMarks.Length-1;i>=0;i--)

{

string[]sChildMark=sChildMarks[i].Split(':');

try

{

handle=WinAPI.GetChildHandles(handle,UnEscape(sChildMark[0]))[int.Parse(sChildMark[1])];

}

catch

{

break;

}

if(i==0)returnnewWinHWND(handle);

}

continue;

}

returnnull;

}

*region轉義

privatestaticstringEscape(stringarg)

{

returnarg.Replace(":","\\:").Replace(";","\\;");

}

privatestaticstringUnEscape(stringarg)

{

returnarg.Replace("\\:",":").Replace("\\;",";");

}

*endregionpublicstaticWinHWNDGetWinHWND()

{

returnnewWinHWND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint()));

}

}上全部代碼,里面加了窗口的局部屬性,擴展其他的屬性,自己發(fā)揮吧,就是搞WinAPIViewCodeusingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Te*t;

usingSystem.Runtime.InteropServices;

usingSystem.Drawing;

usingSystem.Collections;

namespaceInformationCollectionDataFill

{

publicclassWinAPI

{

*regionWinodwsAPI

[DllImport("user32.dll",EntryPoint="FindWindow")]

privatestatice*ternIntPtrFindWindow(stringIpClassName,stringIpWindowName);

[DllImport("user32.dll",EntryPoint="FindWindowE*")]

privatestatice*ternIntPtrFindWindowE*(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass,stringlpszWindow);

[DllImport("user32.dll",EntryPoint="SendMessage")]

privatestatice*ternintSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,stringlParam);

[DllImport("user32.dll",EntryPoint="GetParent")]

publicstatice*ternIntPtrGetParent(IntPtrhWnd);

[DllImport("user32.dll",EntryPoint="GetCursorPos")]

publicstatice*ternboolGetCursorPos(outPointpt);

[DllImport("user32.dll",EntryPoint="WindowFromPoint",CharSet=CharSet.Auto,E*actSpelling=true)]

publicstatice*ternIntPtrWindowFromPoint(Pointpt);

[DllImport("user32.dll",CharSet=CharSet.Auto)]

publicstatice*ternintGetClassName(IntPtrhWnd,StringBuilderlpClassName,intnMa*Count);

[DllImport("user32.dll",CharSet=CharSet.Auto)]

publicstatice*ternintGetWindowTe*t(IntPtrhWnd,[Out,MarshalAs(UnmanagedType.LPTStr)]StringBuilderlpString,intnMa*Count);

[DllImport("user32.dll",CharSet=CharSet.Auto)]

publicstatice*ternintGetWindowRect(IntPtrhwnd,refRectanglerc);

[DllImport("user32.dll",CharSet=CharSet.Auto)]

publicstatice*ternintGetClientRect(IntPtrhwnd,refRectanglerc);

[DllImport("user32.dll",CharSet=CharSet.Auto)]

publicstatice*ternintMoveWindow(IntPtrhwnd,int*,inty,intnWidth,intnHeight,boolbRepaint);

[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true,E*actSpelling=true)]

publicstatice*ternintScreenToClient(IntPtrhWnd,refRectanglerect);

*endregion*region封裝API方法

///<summary>///找到句柄

///</summary>///<paramname="IpClassName">類名</param>///<returns></returns>

publicstaticIntPtrGetHandle(stringIpClassName)

{

returnFindWindow(IpClassName,null);

}

///<summary>///找到句柄

///</summary>///<paramname="p">坐標</param>///<returns></returns>

publicstaticIntPtrGetHandle(Pointp)

{

returnWindowFromPoint(p);

}

//鼠標位置的坐標

publicstaticPointGetCursorPosPoint()

{

Pointp=newPoint();

if(GetCursorPos(outp))

{

returnp;

}

returndefault(Point);

}///<summary>///子窗口句柄

///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="hwndChildAfter">前一個同目錄級同名窗口句柄</param>///<paramname="lpszClass">類名</param>///<returns></returns>

publicstaticIntPtrGetChildHandle(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass)

{

returnFindWindowE*(hwndParent,hwndChildAfter,lpszClass,null);

}

///<summary>///全部子窗口句柄

///</summary>///<paramname="hwndParent">父窗口句柄</param>///<paramname="className">類名</param>///<returns></returns>

publicstaticList<IntPtr>GetChildHandles(IntPtrhwndParent,stringclassName)

{

List<IntPtr>resultList=newList<IntPtr>();

for(IntPtrhwndClient=GetChildHandle(hwndParent,IntPtr.Zero,className);hwndClient!=IntPtr.Zero;hwndClient=GetChildHandle(hwndParent,hwndClient,className))

{

resultList.Add(hwndClient);

}

returnresultList;

}

///<summary>///給窗口發(fā)送容

///</summary>///<paramname="hWnd">句柄</param>///<paramname="lParam">要發(fā)送的容</param>

publicstaticvoidSetTe*t(IntPtrhWnd,stringlParam)

{

SendMessage(hWnd,WM_SETTE*T,IntPtr.Zero,lParam);

}

privateconstintWM_SETTE*T=0*000C;

///<summary>///獲得窗口容或標題

///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>

publicstaticstringGetTe*t(IntPtrhWnd)

{

StringBuilderresult=newStringBuilder(128);

GetWindowTe*t(hWnd,result,result.Capacity);

returnresult.ToString();

}

///<summary>///找類名

///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>

publicstaticstringGetClassName(IntPtrhWnd)

{

StringBuilderlpClassName=newStringBuilder(128);

if(GetClassName(hWnd,lpClassName,lpClassName.Capacity)==0)

{

thrownewE*ception("notfoundIntPtr!");

}

returnlpClassName.ToString();

}

///<summary>///窗口在屏幕位置

///</summary>///<paramname="hWnd">句柄</param>///<returns></returns>

publicstaticRectangleGetWindowRect(IntPtrhWnd)

{

Rectangleresult=default(Rectangle);

GetWindowRect(hWnd,refresult);

returnresult;

}

///<summary>///窗口相對屏幕位置轉換成父窗口位置

///</summary>///<paramname="hWnd"></param>///<paramname="rect"></param>///<returns></returns>

publicstaticRectangleScreenToClient(IntPtrhWnd,Rectanglerect)

{

Rectangleresult=rect;

ScreenToClient(hWnd,refresult);

returnresult;

}

///<summary>///窗口大小

///</summary>///<paramname="hWnd"></param>///<returns></returns>

publicstaticRectangleGetClientRect(IntPtrhWnd)

{

Rectangleresult=default(Rectangle);

GetClientRect(hWnd,refresult);

returnresult;

}

*endregion

}

publicclassWinHWND

{

publicIntPtrHWND{get;set;}

publicstringClassName{get;set;}

publicWinHWNDParent{get;set;}

publicintInParentSequence{get;set;}

privateRectangle_currentRect;

privatestring_Te*t;

privateint_Left;

privateint_Top;

privateint_Width;

privateint_Height;

publicstringTe*t

{

get

{

return_Te*t==default(string)"WinAPI.GetTe*t(this.HWND):_Te*t;

}

set

{

_Te*t=value;

WinAPI.SetTe*t(this.HWND,value);

}

}

publicintLeft

{

get

{

return_Left==default(int)"_currentRect.Left:_Left;

}

set

{

_Left=value;

WinAPI.MoveWindow(this.HWND,value,this.Top,this.Width,this.Height,true);

}

}

publicintTop

{

get

{

return_Top==default(int)"_currentRect.Top:_Top;

}

set

{

_Top=value;

WinAPI.MoveWindow(this.HWND,this.Left,value,this.Width,this.Height,true);

}

}

publicintWidth

{

get

{

return_Width==default(int)"_currentRect.Width:_Width;

}

set

{

_Width=value;

WinAPI.MoveWindow(this.HWND,this.Left,this.Top,value,this.Height,true);

}

}

publicintHeight

{

get

{

return_Height==default(int)"_currentRect.Height:_Height;

}

set

{

_Height=value;

WinAPI.MoveWindow(this.HWND,this.Left,this.Top,this.Width,value,true);

}

}

privateWinHWND(){}

publicWinHWND(IntPtrhWnd)

{

this.HWND=hWnd;

this.ClassName=GetClassName();

this.Parent=GetParent();

this.InParentSequence=GetInParentSequence();

this._currentRect=GetRect();

}

privatestringGetClassName()

{

returnWinAPI.GetClassName(this.HWND);

}

privateWinHWNDGetParent()

{

if(WinAPI.GetParent(this.HWND)==null)

{

thrownewE*ception("notfoundIntPtr!");

}

if(WinAPI.GetParent(this.HWND)==IntPtr.Zero)

{

returnnull;

}

returnnewWinHWND(WinAPI.GetParent(this.HWND));

}

privateintGetInParentSequence()

{

IntPtrIntprtParent=this.Parent==null"IntPtr.Zero:this.Parent.HWND;

returnWinAPI.GetChildHandles(IntprtParent,this.ClassName).Inde*Of(this.HWND);

}

privateRectangleGetRect()

{

if(this.Parent==null)returndefault(Rectangle);

RectangleclientSize=WinAPI.GetClientRect(this.HWND);

RectangleclientPoint=WinAPI.ScreenToClient(this.Parent.HWND,WinAPI.GetWindowRect(this.HWND));

returnnewRectangle(clientPoint.*,clientPoint.Y,clientSize.Width,clientSize.Height);

}

publicstaticWinHWNDGetWinHWND()

{

returnnewWinHWND(WinAPI.GetHandle(WinAPI.GetCursorPosPoint()));

}

publicoverridestringToString()

{

StringBuilderresult=newStringBuilder();

for(WinHWNDwinHandle=this;winHandle!=null;winHandle=winHandle.Parent)

{

result.Append(string.Format("{0}:{1};",Escape(winHandle.ClassName),winHandle.InParentSequence.ToString()));

if(winHandle.InP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論