在win2000、winXP下看 **********

KITTI数据集下载及解析 KITTI数据集下载及解析 版本 更新时间 更新内容 作者 1 V 1.0 xxx 完成主体内容 W. Xiao 2 文章目录KITTI Dataset1 简介1.1 数据采集平台1.2 坐标系2 数据解析2.1 image文件2.2 velodyne文件2.3 calib文件2.4 label文件3 KITTI可视... 阅读详情

本文将讲述如何在win2000下如何编程实现得到应用程序中的密码框中的密码及网页密码框中的密码
记得在win98的时候,只要向一个密码框发一个WM_GETTEXT的消息就可以很容易的得到了其中的密码,微软可能已经意识到了,这一个不安的因素,在win2000/xp中,像以前那样写一个应用程序,向别的程序的密码框简单的发送一个WM_GETTEXT的消息就得到密码了,原因是在进程间数据是相互隔离的,如果参数窗口句柄不属于该进程的调用线程,函数执行就会失败,为了解决这个问题,我们可以用钩子函数实现,钩子函数一般存于动态链接库中,win32会自动把动态链接库映射到它影响的各个进程,在这其间该动态链接库的其它函数也会连带映射到运行的进程之中。这样钩子函数也就会和它的寄主程序窗口融为一体。在这样的一个进程中,由于dll的插入映射使得函数参数窗口句柄hwnd就属于该进程了,而这是win32所允许的。所以写一个dll并将其注入到有密码的进程中,这样就可以dll看成进程的一步分了,再用WM_COPYDATA来进行进程的通信,来将密码显示发送到我们要显示的程序中。
好了理论说完了,开始动手用vc做一个程序了。
先建立一个基于对话框的程序GetPass,其它选项为默认值。
再加入一个edit控件,其ID为IDC_EDIT1用来显示得到的密码信息。
在CGetPassDlg::OnInitDialog()的最后中加入
const CWnd * pWndInsertAfter;
 pWndInsertAfter = &wndTopMost;
 SetWindowPos(pWndInsertAfter,0,0,0,0,SWP_NOSIZE);//将窗口放于最上层

 SetTimer(1,100,NULL);//每隔500毫秒来取得一次密码。

 BOOL k=InitHook(this->m_hWnd);//挂接钩子
 if(k==FALSE)
  AfxMessageBox("false");
重载OnTimer函数,加入如下代码
 HWND hwnd;
 CPoint MousePos;
 GetCursorPos(&MousePos); //取得当前鼠标的坐标

 hwnd= ::WindowFromPoint(MousePos);//得到当前坐标的对应窗口的句柄
 GetPassText(hwnd, m_hWnd);//调用这个函数来取得密码

 得用classwzard为消息WM_COPYDATA加入响函数OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)加入如下代码,来得到dll传来的密码:
 SetDlgItemText(IDC_EDIT1, (LPCTSTR)pCopyDataStruct->lpData);
这时编译我们的程序时会有两个错误如下
error C2065: 'InitHook' : undeclared identifier
error C2065: 'GetPassText' : undeclared identifier
这两个函数是我们要在dll中建立。所以我们再新建一个名为Password的project,选择MFC AppWizard(dll),并且Add to Current Workplace
并且选择add to current workspace.其它的按照默认值。
先在Password.cpp的最上面加入变量与宏定义

#define MAX_TEXTLEN 1024
#define UM_GETPASS WM_USER + 0x392
HINSTANCE ghInstance = 0;
#pragma data_seg("ALLDATA")
 HHOOK g_hHook = NULL;
 HINSTANCE g_hDllIns = NULL;
 HWND g_hHostWnd = NULL;
#pragma data_seg()

再改写一下Password.def其代码如下:
LIBRARY      "Password"
DESCRIPTION  'Password Windows Dynamic Link Library'
EXPORTS
   InitHook   @1
 ReleaseHook   @2
 GetPassText   @3
SECTIONS
 ALLDATA SHARED


//我们手动加入的函数声明与变量
利用classwzard为CPasswordApp加入CPasswordApp::InitInstance()
其中的代码为:

  g_hDllIns =AfxGetInstanceHandle();
 DisableThreadLibraryCalls(g_hDllIns);
再在Password.cpp中的全局变量CPasswordApp theApp之后加入如下代码:

LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
 try {
  if (code >= 0){

   LPMSG pMsg = (LPMSG)lParam;

   HWND hShowPassWnd = (HWND)pMsg->lParam;

   if (pMsg->message == UM_GETPASS && g_hHostWnd == hShowPassWnd){ //获取*号中的内容

    HWND hPassWnd = (HWND)pMsg->wParam; //*号窗口的HWND

    if (hPassWnd){
     TCHAR szPassText[MAX_TEXTLEN];
     ZeroMemory(szPassText, MAX_TEXTLEN);
     ::SendMessage(hPassWnd, WM_GETTEXT, MAX_TEXTLEN, (LPARAM)szPassText); //获取内容
    
     COPYDATASTRUCT cd;
     ZeroMemory(&cd, sizeof(cd));
     cd.dwData = (DWORD)hPassWnd;
     cd.cbData = strlen(szPassText) + 1;
     cd.lpData = szPassText;
     SendMessage(hShowPassWnd, WM_COPYDATA, (WPARAM)hPassWnd, (LPARAM)&cd);//发送给ShowPass窗口
    }
   }
  }
 }
 catch(...){
 }

 return CallNextHookEx(g_hHook, code, wParam, lParam);
}
 BOOL  InitHook(HWND hWnd)
{
 try {
  if (!hWnd){
   return FALSE;
  }

  g_hHostWnd = hWnd;
  g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hDllIns, 0);
  return g_hHook != NULL;
 }
 catch (...){
 
  return FALSE;
 }
}
HWND WINAPI GetParentFromHwnd(HWND hWnd)
{
 HWND hParWnd;
 try {
  do {
   hParWnd = GetParent(hWnd);
   if (hParWnd){
    hWnd = hParWnd;
   }
  }while (hParWnd);
 }
 catch (...){
 }

 return hWnd;
}

void  GetPassText(HWND hWndPass, HWND hWndShowPass)
{
 try {
  HWND hParWnd = GetParentFromHwnd(hWndPass);
  ::PostMessage(hParWnd, UM_GETPASS, (WPARAM)hWndPass, (LPARAM)hWndShowPass);
 }
 catch(...){
 }
}
//卸载
 BOOL  ReleaseHook()
{
 BOOL bSuccess = FALSE;
 try {
  if(g_hHook != NULL)
  {
   bSuccess = UnhookWindowsHookEx(g_hHook) ? TRUE : FALSE;
   g_hHook = NULL;
   g_hHostWnd = NULL;
  }
 }
 catch (...){
 }
 return bSuccess;
}
再在Password.h中加入函数导出声明
extern "C" _declspec(dllexport) void  GetPassText(HWND hWndPass, HWND hWndShowPass);
extern "C" _declspec(dllexport) BOOL  InitHook(HWND hWnd);
extern "C" _declspec(dllexport) BOOL  ReleaseHook();

最后编译、链接,把生成的Password.dll,Password.lib拷贝到GetPass工程的目录下,在GetPass工程的GetPassDlg.cpp的最上面加入如下代码
#pragma comment(lib,"Password.lib")
//隐式链接
extern "C" _declspec(dllexport) void  GetPassText(HWND hWndPass, HWND hWndShowPass);
extern "C" _declspec(dllexport) BOOL  InitHook(HWND hWnd);
extern "C" _declspec(dllexport) BOOL  ReleaseHook();
最后运行程序,把鼠标指向应用程序的密码框就可以看到密码了。
但是我们把鼠标指向网页上的密码框时我们无法得到其内容,因为网页密码框不是一般的EDIT控件,因此不能取得网页密码框的句柄.要实现这个功能,只好通过WebBrowser控件的有关COM接口了.因此取得这些接口是整个程序的关键.
在msdn上可以找到在不同的进程中取得IE的Webbrowser控件的IHTMLDocument2接口的方法它的实现机理是向Webbrowser控件(窗口类名是"Internet Explorer_Server")发一个WM_HTML_GETOBJECT,然后把返回值传给Microsoft Active Accessibility (MSAA) 函数ObjectFromLresult,这样你会取得一个已经编排(Marshaling)过的COM接口.如下函数所示:
IHTMLDocument2* GetDocInterface(HWND hWnd)
{
 // 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
 HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
 IHTMLDocument2* pDoc2=NULL;
 if ( hInst != NULL ){
  if ( hWnd != NULL ){
   CComPtr<IHTMLDocument> spDoc=NULL;
   LRESULT lRes;
   /*由于WM_HTML_GETOBJECT非Windows标准消息,所以需要RegisterWindowMessage*/
   UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
   ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

   /*取得ObjectFromLresult函数的地址*/
   LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
   if ( pfObjectFromLresult != NULL ){
    HRESULT hr;
    hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);
    if ( SUCCEEDED(hr) ){
     CComPtr<IDispatch> spDisp;
     CComQIPtr<IHTMLWindow2> spWin;
     spDoc->get_Script( &spDisp );
     spWin = spDisp;
     spWin->get_document( &pDoc2 );
    }
   }
  }
  ::FreeLibrary(hInst);
 }
 else{//如果没有安装MSAA
  AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
 }
 return pDoc2;
}

请注意.如果程序在Windows95,98和NT 4.0 Service With  Pack 4 or 5下运行必须要把Microsoft Active Accessibility (MSAA)运行时组件(RDK)与程序一起发布(Windows2000及Windows NT 4.0 Service With Pack 6中已经有了,所以不用)..3.使用这种方法前要调用CoInitialize(NULL);然后应该相应地调用CoUninitialize(); 所以我们先在CGetPassDlg::OnInitDialog()的最后加入CoInitialize(NULL);再重载WM_DESTROY消息,在其对应函数void CGetPassDlg::OnDestroy()中加入如下代码:
 CoUninitialize();//卸载com组件
KillTimer(1); //卸载时钟

这样,我们就取得了IHTMLDocument2*接口了,要取得密码框的密码还得一番周折,现在改写我们刚才的GetPass工程的void CGetPassDlg::OnTimer(UINT nIDEvent)函数,其改写后的内容如下:
 HWND hwnd;
 CPoint MousePos;
 GetCursorPos(&MousePos); //取得当前鼠标的坐标
 static TCHAR buf[100];
 hwnd= ::WindowFromPoint(MousePos);//得到当前坐标的对应窗口的句柄
 if(hwnd!=NULL){
   ::GetClassName( hwnd, (LPTSTR)&buf, 100 );
   if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
//如果是ie则用别的方法
   {
    POINT iept=MousePos;
    ::ScreenToClient(hwnd,&iept);
    GetPassword(GetDocInterface(hwnd),iept);
   }
   else //如果是其它窗口则用原来的方法来取得密码

     GetPassText(hwnd, m_hWnd);

  }
  CDialog::OnTimer(nIDEvent);
再在CgetPassDlg类中加入两个成员函数
void CGetPassDlg::GetPassword(IHTMLDocument2 *pDoc2, POINT pt)
IHTMLDocument2* CGetPassDlg::GetDocInterface(HWND hWnd)
IHTMLDocument2* CGetPassDlg::GetDocInterface(HWND hWnd)函数的代码如前所述
void CGetPassDlg::GetPassword(IHTMLDocument2 *pDoc2, POINT pt)的代码如下:
if(pDoc2==NULL)return;
 CComPtr<IHTMLElement> pElement;
 HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);
 if(pElement==NULL)return;
 if(SUCCEEDED(hr)){
  CComPtr<IHTMLInputTextElement> pPwdElement;
  hr=pElement->QueryInterface(IID_IHTMLInputTextElement,
   (void**)&pPwdElement);
  if(SUCCEEDED(hr)){
   CComBSTR type;
   hr=pPwdElement->get_type(&type);
   if(SUCCEEDED(hr)){
    if(type==_T("password")){
     CComBSTR pwd;
     hr=pPwdElement->get_value(&pwd);
     if(SUCCEEDED(hr)){
      if(pwd.Length()!=0){
       CComBSTR msg=_T("");
       msg+=pwd;
       CString str(msg);
      SetDlgItemText(IDC_EDIT1, str);
      UpdateData(false);
      }
      else{
      SetDlgItemText(IDC_EDIT1, "密码为空");
      UpdateData(false);
      }
     }
    }
   }
  }
 }
 pDoc2->Release();
最后在stdafx.h中加入所用的头文件
#include <atlbase.h>
#include <oleacc.h>
#include <winuser.h>
#include <mshtml.h>
这样再编译链接我们的程序,把鼠标指向网页的密码框时就可以得到密码了。

R语言环境下Bibliometrix与Biblioshiny的安装与配置指南 本文提供了在R语言环境下安装与配置Bibliometrix和Biblioshiny的详细指南。内容涵盖R与RStudio的安装、Bibliometrix包的安装避坑方法,以及如何启动Biblioshiny图形界面进行文献计量分析。重点解决了安装过程中的常见网络与依赖问题,帮助科研人员快速搭建高效的文献分析环境。 阅读详情

相关推荐

在时间轴上联动多张内表:ABAP 的 PROVIDE ... ENDPROVIDE 区间联动迭代实战

PROVIDE 是 ABAP 中处理有效期区间数据的强大工具,它能自动将多张内表按时间维度切片并联合处理。其核心功能包括:指定区间边界字段(BOUNDS),定义外部总区间(BETWEEN),并通过工作区和标志位(VALID)标识每张表在当前子区间是否生效。该语法特别适合 HR 信息类型等有效期数据,能避免手动处理区间重叠、排序和空档等问题。使用时需注意字段投影(FIELDS)限制、工作区只读原则,以及异常处理(如区间重叠或未排序)。典型应用场景包括员工调岗记录、价格有效期管理等需要时间轴联动的业务逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1628

C++中获取WinNT/Win2k当前用户名和密码

标签: C++   // 获取WinNT/Win2k当前用户名和密码,调用以下函数即可:   // bool GetPassWord(String &strCurrDomain, String &strCurrUser, String &strCurrPwd)   //--------------------------------------------------------------

u013468790的专栏 550

DM检验 matlab 软件

模型比较时 运动DM检验进行检验

CDialog2::CDialog2(CWnd* pParent /*=NULL*/) : CDialogEx(CDialog2::IDD, pParent) { }

Cwnd* pParent 是它的父对话框的窗口指针,是从:CDialog类里面派生出来的对话框窗体,是用父类的构造函数来创建自己的窗体。CMydialog::IDD是你用到对话框的ID标识,pParent是指向父类的指针。...

cxq_1994的博客 3940

将应用程序11M内存占用,降至500K

最近解决了一个问题-减少内存占用。不过是有条件的,只能在WinXp,Win2K中应用此方法,不显示主窗体一直运行的程序最佳。以前程序占用11M内存,我用动态创建窗口的方法只能减少不到100K,应用此方法后内存占用只有496K。把下面的过程放到一个Timer中,每隔一段时间执行一次,如5秒。{*********** Clear Memory* From Muse2008**********}proc

477

如何得到其它进程的启动命令行参数 (转)

 如何得到其它进程的启动命令行参数 ILSY:这个程序可以得到其他进程的命令行参数。// procmdline.cpp (Windows NT/2000)//// This example shows how to get the command line for almost any process// on the system for Windows NT/2000// //// (c)19

Foxmail★Blog 4895

C++回调函数的处理

    由于DDEML机制需要使用回调函数,因此使用DDEML的关键是解决在MFC编程体系中回调函数的使用。回调函数(Callback function)大量用于Windows的系统服务,通过它,程序员可以安装设备驱动程序和消息过滤系统,以控制Windows的有效使用。许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows SDK

Foxmail★Blog 4347

金山词霸2003导致我的程序堆栈溢出错误

最近发现金山词霸屏幕取词功能导致连连看在ET内执行的时候堆栈溢出而连连看单机版则无此问题。郁闷异常,分析金山词霸的取词功能如下:1 屏幕抓词  屏幕抓词(或者叫动态翻译)是指随着鼠标的移动,软件能够随时获知屏幕上鼠标位置的单词或汉字,并翻译出来提示用户。它对於上网浏览、在线阅读外文文章等很有帮助作用,因此许多词典软件都提供了屏幕抓词功能。  屏幕抓词的关键是如何获得鼠标位置的字符串,Windo

Foxmail★Blog 3648

VC中特殊字体的实现(转)

渐变字:// 获得窗口的客户区设备上下文句柄       CClientDC dc(this);       // 更改当前字体       LOGFONT lf;       dc.GetCurrentFont()->GetLogFont(&lf);       CFont font, *pOldFont;       lf.lfCharSet=134;     

Foxmail★Blog 3335

如何在程序中动态设置墙纸

标题     如何在程序中动态设置墙纸    zwvista(原作)    关键字     Wallpaper IActiveDesktop   大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParametersInfo(SPI_SETDESKWALLPAPER

Foxmail★Blog 3115

VC++开发BHO插件——定制你的浏览器

VC++开发BHO插件——定制你的浏览器  作者 陆其明 关键字 BHO Browser COM ATL 网址过滤原作者姓名 陆其明 读者评分 5 评分次数 1 正文在Windows操作系统上,我们最常见的浏览器有两种:文件浏览器(exploer.exe,应用于文件系统)和Internet浏览器(iexplore.exe,应用于互联网资源)。由于这两个浏览器功能强大,而且又与Windows操作系统

Foxmail★Blog 2935

VC++ 的串口通讯

                                              VC++ 的串口通讯       代翔   在VC++中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX 控件 Microsoft Communications Control。另一种是直接用VC++访问串口。下面将简述 这两种方法。   一、Microsoft Commun

Foxmail★Blog 2862

delete this,dll导出类及如何写plugins(PART III) [转]

3.实现plugins。有了前两章的基础,这个就比较好办了。先了解一点点基本概念:Q:what is pluginsA:就是通过加载不同的dll实现不同的功能,或者附加的功能,典型的如模拟器的各种插件(显示,input...)。Q:why we use pluginsA:主要为了使程序模块化,并且容易扩充。升级组件时不需要重新发布整个产品。Q:how to do it?A:使用LoadLibrar

Foxmail★Blog 2512

关于23种设计模式的有趣见解(转)

创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如

Foxmail★Blog 2366

程序控制桌面切换

用向导建立一个Win32程序“hello, world!”,然后用下面的内容替换整个CPP文件内容就可以了 #include "stdafx.h"#include "resource.h" #include "ShellApi.h" HINSTANCE hInst = NULL; HDESK hDesktopCurrent;HDESK hDesktopLlx; LONG APIENTRY WndP

Foxmail★Blog 1994

delete this,dll导出类及如何写plugins(PART I) [转]

1.为什么要使用delete this,以及如何使用。(1)考查这样的情况:有两个对象A,B需要访问同一个多态对象C。因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并且B不知道A什么时候使用完成C,A也不知道B什么时候使用完成C(当然可以用函数通信的方法通知了,不过是一个比较丑陋的实现方法),所以不能在A/B中间来delete,一个折中的办法是在程序退出的时候来d

Foxmail★Blog 1823

C++: The Most Powerful Language for .NET Framework Programming

http://msdn.microsoft.com/visualc/default.aspx?pull=/library/en-us/dnvs05/html/VS05Cplus.asp

Foxmail★Blog 1651

1_in_SMA_SMAabaqus_源码

SMA subroutine in ABAQUS

上一篇: 使用脚本语言和IE右键菜单
下一篇: 寝室夜话
foxmail
博客等级 码龄25年 11粉丝 92原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值