窗口类句柄例程
.net 通过句柄获取窗口信息的方法

.net 通过句柄获取窗口信息的方法嘿,朋友们!今天咱就来唠唠.net 通过句柄获取窗口信息这档子事儿。
咱就说啊,这窗口就好比是一个神秘的小盒子,里面装着各种信息呢。
而句柄呢,就像是打开这个小盒子的钥匙。
你想想,要是没有这把钥匙,你咋能知道盒子里有啥宝贝呀!
要通过句柄获取窗口信息,首先你得找到那个对的句柄呀。
这就跟找宝藏似的,得有耐心,还得有那么点技巧。
你得知道从哪儿开始找,怎么找才能又快又准。
然后呢,当你拿到句柄了,就可以开始施展魔法啦!你可以获取窗口的标题呀,大小呀,位置呀等等这些信息。
就好像你打开盒子后,能清楚地看到里面的各种宝贝一样。
比如说,你可以用它来看看某个程序的窗口标题是不是你想要的。
要是不对,那你就知道可能出问题啦!或者你想知道这个窗口在屏幕上的位置,好安排其他东西的摆放,这多方便呀!
哎呀,这可真是太有用了!你能想象如果没有这种方法,我们得费多大劲儿才能知道这些信息吗?那可真是像无头苍蝇一样乱撞呀!
在实际操作中呢,可不能马虎。
就像做饭一样,调料放多了放少了味道都不对。
你得小心谨慎地处理每一个步骤,不然可能就得不到你想要的结果啦。
而且呀,这还能帮我们解决一些看似很难的问题呢。
比如有时候程序出了点小毛病,通过获取窗口信息,说不定就能找到问题所在,然后轻松解决啦!
总之呢,.net 通过句柄获取窗口信息这招可真是太绝啦!它就像我们的秘密武器,能帮我们在编程的世界里披荆斩棘。
大家可得好好掌握呀,别浪费了这么好的工具!这就是我想说的,大家觉得怎么样呢?是不是很有道理呀!。
用进程名获取进程ID取窗口句柄

以前用输入法注入的时候需要用到的代码,写的还不错,分享一下吧,顺便当个备用 view sourceprint?01 //根据进程名获取进程ID02 DWORD GetPidByProcessName(TCHAR * pProcess)03 {04 HANDLE hSnapshot;05 PROCESSENTRY32 lppe;06 //创建系统快照07 hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); //#include<Tlhelp32.h>08 if (hSnapshot == NULL)09 return 0;10 //初始化 lppe 的大小11 lppe.dwSize = sizeof(lppe);12 //查找第一个进程13 if (!::Process32First(hSnapshot, &lppe))14 return false;15 do16 {17 if(StrCmp(lppe.szExeFile, pProcess) == 0)//#include<shlwapi.h>18 {19 return lppe.th32ProcessID;20 }21 }22 while (::Process32Next(hSnapshot, &lppe)); //查找下一个进程2324 return 1;25 }2627//根据进程ID获取窗口句柄28 HWND GetHwndByPid(DWORD dwProcessID)29 {30//返回Z序顶部的窗口句柄31 HWND hWnd = ::GetTopWindow(0);32 while ( hWnd )33 {34 DWORD pid = 0;35//根据窗口句柄获取进程ID36 DWORD dwTheardId = ::GetWindowThreadProcessId( hWnd,&pid);3738 if (dwTheardId != 0)39 {40 if ( pid == dwProcessID )41 {42 return hWnd;43 }44 }45//返回z序中的前一个或后一个窗口的句柄46 hWnd = ::GetNextWindow(hWnd , GW_HWNDNEXT);47 }48 return hWnd;49 }50 //前端显示并置顶窗口51 void ShowForeGround(HWND hWnd)52 {53 if (hWnd)54 {55 //显示窗口56 ::ShowWindow(hWnd, SW_NORMAL);5758 //前端显示59 ::SetForegroundWindow(hWnd);6061 //窗口置顶62 ::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);63 }64 else65 {66 ::MessageBox(NULL, _T("未找到窗口"), _T("提示"),MB_OK);67 }68 }69 void main()70 {71 // TODO: 在此添加控件通知处理程序代码72 DWORD dwPid = GetPidByProcessName(_T("notepad.exe"));73 HWND hWnd = GetHwndByPid(dwPid);74 ShowForeGround(hWnd);75 }。
获得桌面所有窗口句柄的方法总结

获得桌面所有窗口句柄的方法总结第一种方法:1.先获得桌面窗口CWnd* pDesktopWnd = CWnd::GetDesktopWindow();2.获得一个子窗口CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);3.循环取得桌面下的所有子窗口while(pWnd != NULL){//获得窗口类名CString strClassName = _T("");//应该用TCHAR,用CStrting没有测试通过.::GetClassName(pWnd->GetSafeHwnd(),strClassName.GetB uffer(256),256);//获得窗口标题CString strWindowText = _T("");::GetWindowT ext(pWnd->GetSafeHwnd(),strWindowT ext.Ge tBuffer(256),256);//继续下一个子窗口pWnd = pWnd->GetWindow(GW_HWNDNEXT);}第二种方法:1.定义存放窗口句柄变量,和下标计数器HWND m_hWndFind[1000]; int m_Index;2.先写一个BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam) 的回调函数.BOOL CAllwindowsDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam){//查找可见的窗口if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE){m_hwndFind[m_Index] = hWnd;//record the HWND handle into arraym_Index++;//count start}return 1;}3.调用(这个回调函数回自动递归的便利所有可见窗口,直到完毕)::EnumWindows(CAllwindowsDlg::EnumWindowsProc,NULL);4.取得窗口名称和类名for(int i = 0;i <=m_Index;i++){HWND m_wnd = m_hwndFind[i];::GetWindowT ext(m_wnd,m_store,128);::GetClassName(m_wnd,m_strClass,MAX_PATH-1);//获得窗口类名CString strClassName = _T("");::GetClassName(m_wnd,strClassName.GetBuffer(256),256);//获得窗口标题CString strWindowText = _T("");::GetWindowT ext(m_wnd,strWindowText.GetBuffer(256),256);}。
嵌入窗口例程[易语言源码]
![嵌入窗口例程[易语言源码]](https://img.taocdn.com/s3/m/438d43660166f5335a8102d276a20029bd6463cf.png)
嵌入窗口例程[易语言源码]
以下是一个简单的易语言源码示例,用于创建一个窗口并在窗口中嵌入一个控件:
plaintext.
程序运行窗口。
窗口 = 新建窗口("嵌入窗口例程", 100, 100, 400, 300)。
控件 = 新建图片框(20, 20, 200, 200, 窗口.句柄)。
控件.图片 = "C:\example.jpg"
窗口.显示()。
窗口.消息循环()。
结束。
在这个例程中,首先创建了一个窗口对象,然后在窗口中创建了一个图片框控件,并指定了控件的位置和大小。
接着将图片框控件嵌入到窗口中,并设置了图片的路径。
最后显示窗口并启动消息循环以响应用户操作。
这个例程演示了如何在易语言中创建一个窗口并在窗口中嵌入一个控件,你可以根据自己的需求进行进一步的扩展和修改。
c语言句柄示例

c语言句柄示例C语言句柄示例在C语言中,句柄(Handle)是一种特殊的数据类型,用于表示资源的引用或标识符。
它可以是指向某个对象的指针、文件描述符、窗口句柄等。
句柄的使用可以提高程序的效率和灵活性,下面是一些常见的C语言句柄示例:1. 文件句柄(File Handle):在C语言中,使用文件句柄来操作文件,比如打开、读取和关闭文件。
文件句柄通常是一个整数值,通过调用文件操作函数来获取和使用。
例如,使用fopen函数打开文件,返回的文件句柄可以用于后续的文件读写操作。
2. 内存句柄(Memory Handle):在C语言中,使用内存句柄来管理动态分配的内存。
内存句柄通常是一个指向内存块的指针,可以通过malloc或calloc函数分配内存,并使用free函数释放内存。
内存句柄的使用可以避免内存泄漏和提高内存的利用率。
3. 窗口句柄(Window Handle):在图形用户界面(GUI)编程中,窗口句柄是用来表示窗口的标识符。
它通常是一个整数值或指针,可以用于操作窗口,比如创建、显示和关闭窗口。
在Windows操作系统中,使用HWND类型表示窗口句柄。
4. 设备句柄(Device Handle):在设备驱动程序中,设备句柄用于表示设备的标识符。
它可以是一个整数值或指针,用于与设备进行通信,比如打开、读取和写入设备。
设备句柄的使用可以实现对硬件设备的控制和操作。
5. 线程句柄(Thread Handle):在多线程编程中,线程句柄用于表示线程的标识符。
它可以是一个整数值或指针,用于创建、启动和等待线程的结束。
线程句柄的使用可以实现多线程并发执行,提高程序的性能和响应能力。
6. 互斥量句柄(Mutex Handle):在多线程编程中,互斥量句柄用于实现线程间的互斥访问。
它可以是一个整数值或指针,用于创建、加锁和解锁互斥量。
互斥量句柄的使用可以避免多个线程同时访问共享资源,保证数据的一致性和正确性。
7. 信号量句柄(Semaphore Handle):在多线程编程中,信号量句柄用于实现线程间的同步和通信。
windows获取窗口句柄

windows获取窗⼝句柄windows获取窗⼝句柄1、使⽤FindWindow函数获取窗⼝句柄⽰例:使⽤FindWindow函数获取窗⼝句柄,然后获得窗⼝⼤⼩和标题,并且移动窗⼝到指定位置。
12 #include <Windows.h>3 #include <stdio.h>4 #include <string.h>5 #include <iostream.h>67int main(int argc, char* argv[])8 {9//根据窗⼝名获取QQ游戏登录窗⼝句柄10 HWND hq=FindWindow(NULL,"QQ2012");1112//得到QQ窗⼝⼤⼩13 RECT rect;14 GetWindowRect(hq,&rect);15int w=rect.right-rect.left,h=rect.bottom-rect.top;16 cout<<"宽:"<<w<<""<<"⾼:"<<h<<endl;1718//移动QQ窗⼝位置19 MoveWindow(hq,100,100,w,h,false);2021//得到桌⾯窗⼝22 HWND hd=GetDesktopWindow();23 GetWindowRect(hd,&rect);24 w=rect.right-rect.left;25 h=rect.bottom-rect.top;26 cout<<"宽:"<<w<<""<<"⾼:"<<h<<endl;2728return0;29 }2、使⽤EnumWindows和EnumChildWindows函数以及相对的回调函数EnumWindowsProc和EnumChildWindowsProc获取所有顶层窗⼝以及它们的⼦窗⼝(有些窗⼝做了特殊处理,⽐如QQ是不能通过这个⽅法获得的)⽰例:1 #include "stdafx.h"2 #include <Windows.h>3 #include <stdio.h>4 #include <tchar.h>5 #include <string.h>6 #include <iostream.h>78//EnumChildWindows回调函数,hwnd为指定的⽗窗⼝9 BOOL CALLBACK EnumChildWindowsProc(HWND hWnd,LPARAM lParam)10 {11char WindowTitle[100]={0};12 ::GetWindowText(hWnd,WindowTitle,100);13 printf("%s\n",WindowTitle);1415return true;16 }1718//EnumWindows回调函数,hwnd为发现的顶层窗⼝19 BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)20 {21if (GetParent(hWnd)==NULL && IsWindowVisible(hWnd) ) //判断是否顶层窗⼝并且可见22 {23char WindowTitle[100]={0};24 ::GetWindowText(hWnd,WindowTitle,100);25 printf("%s\n",WindowTitle);2627 EnumChildWindows(hWnd,EnumChildWindowsProc,NULL); //获取⽗窗⼝的所有⼦窗⼝28 }2930return true;31 }3233int main(int argc, _TCHAR* argv[])34 {35//获取屏幕上所有的顶层窗⼝,每发现⼀个窗⼝就调⽤回调函数⼀次36 EnumWindows(EnumWindowsProc ,NULL );3738return0;39 }3、使⽤GetDesktopWindow和GetNextWindow函数得到所有的⼦窗⼝⽰例:1 #include "stdafx.h"2 #include <Windows.h>3 #include <stdio.h>4 #include <tchar.h>5 #include <string.h>6 #include <iostream.h>78int main(int argc, _TCHAR* argv[])9 {10//得到桌⾯窗⼝11 HWND hd=GetDesktopWindow();1213//得到屏幕上第⼀个⼦窗⼝14 hd=GetWindow(hd,GW_CHILD);15char s[200]={0};1617//循环得到所有的⼦窗⼝18while(hd!=NULL)19 {20 memset(s,0,200);21 GetWindowText(hd,s,200);22/*if (strstr(s,"QQ2012"))23 {24 cout<<s<<endl;25 SetWindowText(hd,"My Windows");26 }*/27 cout<<s<<endl;2829 hd=GetNextWindow(hd,GW_HWNDNEXT);30 }3132return0;33 }。
hdc取窗口句柄
hdc取窗口句柄HDC(Handle to Device Context)是Windows系统中的一个概念,用于表示设备上下文或设备环境。
在Windows编程中,可以使用HDC来操作和管理绘图设备,如窗口、位图、打印机等。
本文将列举10个使用HDC获取窗口句柄的示例,以帮助读者更好地理解和应用该概念。
1. 通过窗口类名获取窗口句柄:HWD hwnd = FindWindow("ClassName", NULL);通过指定窗口类名,可以获取与该类名对应的第一个窗口的句柄。
2. 通过窗口标题获取窗口句柄:HWD hwnd = FindWindow(NULL, "WindowTitle");通过指定窗口标题,可以获取与该标题对应的第一个窗口的句柄。
3. 通过父窗口句柄和子窗口类名获取子窗口句柄:HWD hwndParent = FindWindow("ParentClassName", NULL);HWD hwndChild = FindWindowEx(hwndParent, NULL, "ChildClassName", NULL);通过指定父窗口句柄和子窗口类名,可以获取与该父窗口关联的第一个子窗口的句柄。
4. 通过窗口句柄获取窗口标题:char szTitle[256];GetWindowText(hwnd, szTitle, sizeof(szTitle));通过指定窗口句柄,可以获取与该窗口关联的标题。
5. 通过窗口句柄获取窗口类名:char szClassName[256];GetClassName(hwnd, szClassName, sizeof(szClassName));通过指定窗口句柄,可以获取与该窗口关联的类名。
6. 通过窗口句柄获取窗口所属进程ID:DWORD dwProcessId;GetWindowThreadProcessId(hwnd, &dwProcessId);通过指定窗口句柄,可以获取与该窗口所属的进程ID。
如何获得窗口句柄(hwnd)和改变窗口属性
1、对于一个窗口如何进行操作呢,首先要得到其使用句柄,我们可以用FindWindow()函数来获取当前窗口句柄,具体使用如下:HWND hFig = ::FindWindow(NULL,HWND);如果得到找到,则返回窗口的句柄,否则返回NULL。
当然我们可以使用SetWindowPos(HWND hWnd, HWND hWndIsertAfter, int X, int Y, int cx, int cy , UINT Uflags) 改变窗口的大小和位置,Uflags是标志窗口的显示属性,具体值可以是SWP_NOMOVE 、SWP_NOZORDER 、SWP_N OACTIVATE 、SWP_FRAMECHANGED等。
具体的调用实例如下:HWND hFig = ::FindWindow(NULL,"Fig No. 1"); //找到窗口,并返回窗口句柄if(hFig == NULL) {AfxMessageBox("未能产生Figure窗口,图形绘制失败!");return;} // 获取绘图区域的位置和大小RECT PlotRec;CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA); // 获取绘图区域指针PlotArea->GetWindowRect(&PlotRec); // 将绘图区域矩形赋给定义矩形long Width = PlotRec.right - PlotRec.left; long Height = PlotRec.bottom - PlotRec.to p; // 获得绘图区域的宽和高// 设置Figure窗口为绘图区域窗口的子窗口并调整其位置::SetParent(hFig,PlotArea->GetSafeHwnd()); // 设置绘图区域窗口为Figure窗口的父窗口::SetWindowPos(hFig,NULL,1,1,Width,Height,SWP_NOZORDER | SWP_NOACTIVATE); // 设置绘图窗口的大小和位置// 设置窗口可见SetVisible(h_a,mwArray("ON"));// 进入窗口等待状态bWait = 1; mlfHGWaitForFiguresToDie();2、当然你想改变窗口属性的话,还可以增加以下函数来改变窗口的属性long lStyle. = ::GetWindowLong(hFig,GWL_STYLE);::SetWindowLong(hFig,GWL_STYLE,lStyle. & (~WS_CAPTION) & (~WS_THICKFRAM E));::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTI VATE | SWP_FRAMECHANGED);就写到这吧,其他的学会了再统一以一个实例的形式给出。
delphi关于窗口句柄,进程等操作
delphi关于窗口句柄,进程等操作转帖/ck85124/blog/item/d44ad17e9c1a163e0cd 7da9e.htmluses TLHelp32,PsAPI;(1)显示进程列表:procedure TForm1.Button1Click(Sender: TObject);varProcessName: string;ProcessID: integer;ListLoop: Boolean;FsnapShotHandle: Thandle;FProcessEntry32: TProcessEntry32;beginListBox1.Clear;Fsnapshothandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);FProcessEntry32.dwsize := SizeOF(FProcessEntry32);Listloop := Process32First(FSnapshotHandle, FProcessEntry32);while Listloop do beginProcessName := FprocessEntry32.szExeFile;ProcessID := FProcessEntry32.th32ProcessID;// 我写到列表框中了,你可以根据需要自己改listbox1.Items.Add(ProcessNAme+':'+IntToStr(ProcessID));ListLoop := Process32Next(FSnapshotHandle, FprocessEntry32);end;end;(2)杀死某进程:procedure TForm1.Button2Click(Sender: TObject);varlppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;ph: THandle;ExitCode: DWORD;sExeFile,sSelect:string;killed:boolean;begintemp:= ListBox1.Items.strings[ListBox1.itemindex];temp:=copy(temp,pos(':',temp)+1,length(temp));p :=DWORD(StrToInt(temp));if P<>0 thenbeginph:=OpenProcess(PROCESS_TERMINATE,False,P);GetExitCodeProcess(ph, ExitCode);killed := TerminateProcess(ph,ExitCode);if not killed thenmessagebox(self.handle,pchar(sExeFile+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)elseListBox1.Items.Delete(ListBox1.ItemIndex);end;end;(3)取得某进程EXE路径:procedure TForm1.Button3Click(Sender: TObject);varh:THandle; fileName:string;iLen:integer;hMod:HMODULE;cbNeeded,p:DWORD;begintemp:= ListBox1.Items.strings[ListBox1.itemindex];temp:=copy(temp,pos(':',temp)+1,length(temp));p :=DWORD(StrToInt(temp));h := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为进程IDif h > 0 thenbeginif EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) thenbeginSetLength(fileName, MAX_PATH);iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);if iLen <> 0 thenbeginSetLength(fileName, StrLen(PCHAR(fileName)));Memo1.Lines.Add(fileName);end;end;CloseHandle(h);end;end;(4)取得窗口列表:procedure TForm1.Button4Click(Sender: TObject);varhCurrentWindow: HWnd;szText: array[0..254] of char;beginListbox1.Clear;//EnumWindows(@EnumWindowsProc, 0); 写了个回调EnumWindowsProc没效果hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);while hCurrentWindow <> 0 dobeginif GetWindowText(hCurrentWindow, @szText, 255) > 0 then listbox1.items.Add(StrPas(@szT ext));hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);end;end;(5)杀死窗口进程:procedure TForm1.Button5Click(Sender: TObject);varH:THandle;P:DWORD;s:string;killed:boolean;begins := ListBox1.Items[ListBox1.ItemIndex];H:=FindWindow(nil,pchar(s));if H<>0 thenbeginGetWindowThreadProcessId(H,@P);if P<>0 thenkilled:=TerminateProcess(OpenProcess(PROCESS_TERMINAT E,False,P),$FFFFFFFF);if not killed thenmessagebox(self.handle,pchar(s+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)elseListBox1.Items.Delete(ListBox1.ItemIndex);end;end;(6)取得窗口进程路径:procedure TForm1.Button6Click(Sender: TObject);varH:THandle;P,cbNeeded:DWORD;s,fileName:string;iLen:integer;hMod:HMODULE;begins := ListBox1.Items[ListBox1.ItemIndex];H:=FindWindow(nil,pchar(s));if H<>0 thenbeginGetWindowThreadProcessId(H,@P);if P<>0 thenbeginh := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为进程IDif h > 0 thenbeginif EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) thenbeginSetLength(fileName, MAX_PATH);iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);if iLen <> 0 thenbeginSetLength(fileName, StrLen(PCHAR(fileName)));end;end;CloseHandle(h);end;end;end;Memo1.Lines.Add(fileName);end;(7)文件属性:function CovFileDate(Fd:_FileTime):TDateTime;{ 转换文件的时间格式 }varTct:_SystemTime;Temp:_FileTime;beginFileTimeToLocalFileTime(Fd,Temp);FileTimeToSystemTime(Temp,T ct);CovFileDate:=SystemTimeT oDateTime(Tct);end;procedure TForm1.Button7Click(Sender: TObject);varSR: TSearchRec;V1, V2, V3, V4: integer ;constdtFmt:string = 'YYYY-MM-DD HH:NN:SS';begin// ============== 方法一==================== //if FindFirst(edit1.Text, faAnyFile, SR) = 0 thenbeginMemo1.Lines.Add('文件属性:' + intToStr(SR.Attr) ); //文件属性Memo1.Lines.Add('文件大小:' + intToStr(SR.Size) ); //文件大小Memo1.Lines.Add('创建时间:' + FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftCreationTime )) ); //创建时间Memo1.Lines.Add('最后修改时间:' + FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastWriteTim e)) ); //最后修改时间Memo1.Lines.Add('最后访问时间:' + FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastAccessTi me)) ); //最后访问时间if SR.Attr and faHidden <> 0 thenFileSetAttr(edit1.Text, SR.Attr-faHidden);FindClose(SR);end;end;procedure TForm1.Button8Click(Sender: TObject);// ============== 方法二==================== //varAttrs: Word;f: file of Byte; // 文件大小必须要定义为" file of byte" ,这样才能取出 bytessize: Longint;//文件属性begin//此方法是打开文件读取字节计算,测试exe的文件必须是未运行状态否则会报io 103错误Attrs:=FileGetAttr(edit1.text);Memo1.Lines.Add('文件属性:' + intToStr(Attrs));//文件大小tryAssignFile(f, edit1.text);Reset(f);size := FileSize(f);Memo1.Lines.Add('文件大小:' + intToStr(size));finallyCloseFile(f);end;end;(8)判断程序是否在运行:procedure TForm1.Button9Click(Sender: TObject);varPrevInstHandle:Thandle;AppTitle:pchar;beginAppTitle := pchar(edit2.Text);PrevInstHandle := FindWindow(nil, AppTitle);if PrevInstHandle <> 0 then beginif IsIconic(PrevInstHandle) thenShowWindow(PrevInstHandle, SW_RESTORE)elseBringWindowT oTop(PrevInstHandle);SetForegroundWindow(PrevInstHandle);end;end;{CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。
用Windows API取得窗体句柄二例
用Windows API取得窗体句柄二例文/胡克Windows通过句柄(Handle)识别每个窗体、控件、菜单和菜单项,当程序运行时,它所包含的每个部件都有一个惟一确定的句柄同其他的部件相区别句柄在Windows API中具有举足轻重的作用,现举三例,有兴趣的读者不妨一试。
获取窗体和控件的句柄步骤如下:1、为了看到显示于屏幕上所有的窗体和控件的句柄,用SetWindowPos函数设置窗口始终在最上面,其他窗口不能覆盖它,并使其只以标题显示于屏幕左上角。
(1)新建一工程,打开API Viwer:Add-ins→API Viewer→File→Load text file→Win32api.txt。
(2)将SetWindowPos函数的声明粘贴到窗体的声明部分:Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long。
(3)程序启动时调用SetWindowPos函数,窗体Load事件代码如下:Private Sub Form_Load()SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow'使窗体一直置于最顶层End Sub卧龙传说提醒:当第二个参数hWndInsertAfter的值为-1时置于顶层;值为-2时不置于顶层。
2、为了找到鼠标指针的X和Y坐标,用上面同样的方法,通过API Viewer工具把获取的鼠标指针位置的API函数GetCursorPos的声明和结构类型声明粘贴到窗体的声明部分:Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Type POINTAPIx As Longy As Long。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
窗口类m_hWnd基本
一)m_hWnd
①m_hWnd这个成员变量,最早是定义在类CWnd中,而且是类CWnd的第一个数据成员,先看一下MSDN的解析:
The handle of the Windows window attached to this CWnd. The m_hWnd data member is a public variable of type HWND.
由此可知,它是窗口类的一个句柄,凡是从CWnd派生的类都有这个句柄,凡是以CWnd 派生的类定义的对象内部也都有这个句柄,它是类或者对象标识自己的句柄。
凡是窗口都有一个句柄用来标识自己,在CWnd类中将这个句柄作为一个成员变量直接封装了,所以CWnd类的成员函数都没有句柄这个参数了,比如::ShowWindow(HWND hWnd),在CWnd类或者派生类中,这个函数就没有参数了,CWnd::ShowWindow(),其实这个函数实现很简单,就是调用了::ShowWindow(HWND hWnd),因为在类里已经封装好了,所以也不需要在传递参数了。
②哪如何获得窗口类的自己的句柄呢?有如下方法:
1、this->m_hWnd;
2、GetSafeHwnd();
3、AfxGetMainWnd()->m_hWnd;
(二)关于this指针,有必要分析一下:
①对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体,即调用同一个代码段。
当程序被编译之后,此成员函数地址即已确定。
而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠this指针,也就是对于每一个类的非静态成员函数,都有一个隐含的this指针,该指针指向调用该成员函数的实例对象。
②一个对象的this指针并不是对象本身的一部分,不会影响sizeof("对象")的结果;它是一个隐含于每一个类的成员函数中的特殊指针。
它指向正在被该成员函数操作的那个对象。
当对一个对象调用非静态成员函数时,编译程序会自动先将对象的地址赋给成员函数的this指针,即作为一个隐含参数传递给成员函数;然后每次非静态成员函数存取非静态数据成员时,由隐含使用this指针,即都会被转化为this->数据成员的方式。
③在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;在X 类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
④由于this并不是一个常规变量,所以,不能取得this的地址。
⑤显式引用this指针的地方:
1、在类的非静态成员函数中返回类对象本身的时候,直接使用return *this;
2、为避免对同一对象进行赋值操作,例如在重载运算符"="时,如:
ClassText& operator = (const ClassText& instance)
{
if(this == &instance) {
return *this;
}
m_nSize = instance.m_nSize;
if(NULL != m_pBuffer) {
delete [] m_pBuffer;
}
m_pBuffer = new char[MAX_PATH];
if(NULL != m_pBuffer ) {
strncpy(m_pBuffer, instance.m_pBuffer, MAX_PATH);
}
return *this;
}
3、当形式参数与成员变量名相同时,如this->n = n (不能写成n = n),否则无法实现对成员变量的赋值操作;
当然了,对于静态成员的访问,就不需要通过this进行访问了,只要在函数名字前加上类名限定符即可,这也就是为什么静态函数无法访问非静态成员了(没有对象指针,如何访问其成员变量?),静态成员函数自然能访问静态成员变量。
因些说:静态成员变量实际上就是一种有访问限制的全局变量而已。
从类的外部访问静态成员变量,前面需要加上类名限定符。