截获消息(2)

原创 2004年07月08日 17:07:00

截获消息(2<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  by sssa2000

2004/07/03

放假了,突然想起还没写完这个东西,呵呵 迟到了。虽然我也知道没什么人看,我还是有始有终,写完它。

上次说到在自己的窗体中截获消息,我们的目的是截获制定程序的消息,怎么办呢?很容易的,我们想到了钩子。

Hook可真是好冬冬,没有他的话黑客编程可就没什么乐趣了。

我们用一个getmessagehook来钩住我们想要得线程的消息。

我们来看一下setwindowshookex函数,可能大家比我熟了 ,我还是唠叨一次吧:

SetWindowsHookEx( idHook:Integer;  //钩子类型

                  Lpfn:TFNHookProc; //钩子函数指针

                  Hmod:HINST;   //delphi里一般都设为HInstance

                  dwThreadId:DWORD //关联的线程

                 ):HHook;stcall;

具体我就不说了,钩子类型很多种什么鼠标 键盘,消息,shell,等等很多种,我们今天要用的是WH_GETMESSAGE类型,用处是:再getmessage函数已经搜索到一个来自应用队列的消息时调用。 

再说一下dwThreadID这个参数制定了线程的id。钩子函数能够监视这个参数定义的线程,或者系统的所有的线程。使用它来过滤并在系统或窗口处理之前处理特定的消息。如果设为0,表示挂钩可以在所有的线程内调用。看来这个参数对我们很重要。

来看一个简单的例子:

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls;

const

  WM_TestMessage = WM_USER + 2000;

type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

var

  HookHandle: HHOOK;

 

function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;

begin

    if (Code = HC_ACTION) then

    if PMsg(Msg)^.Message = WM_TestMessage then

    begin

      showMessage('已经截获该消息');

    end;

    Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  PostMessage(self.Handle,WM_TestMessage,0,0);

end;

 

end.

 

大家着重注意看下面这一句:

HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);

用的是getcurrentthreadid  这是为了演示个大家看,我们可以设置为0,这样就可以监视所有线程了。

由于windows的每一个进程都有独立的进程空间,所以如果要对别的进程操作还要进行进程插入,就是我们常说得injection!!  哇咔咔咔,说到这个词都觉得很酷。

进程插入我就不说了,当然还有办法的,把钩子写在dll里面做成全局的钩子也是可以的,不过还是建议用插入的方法 毕竟全局钩子对系统的性能降低比较大。

好了 该说得都说了。

转载请注明出处哦。

有趣——windows键盘消息截获

理解下windows的消息机制: 1.发生键盘输入事件时,WM_KEYDOWN消息被添加到操作系统消息队列 2.OS判断哪个APP发生了事件,然后从系统消息队列取出消息分发到应用程序消息队列 3...
  • ProgrammeringLearner
  • ProgrammeringLearner
  • 2016年10月28日 23:59
  • 1929

Qt之事件过滤器 截获消息通知 自定义消息处理事件解析.

QEvent::Type:写在最前面. 这个枚举类型定义了Qt中有效的事件类型。事件类型和每个类型的专门类如下: QEvent::None - 不是一个事件。QEvent::Accessibi...
  • qq_24571549
  • qq_24571549
  • 2017年03月22日 20:39
  • 710

MFC截获消息并处理

如果想对键盘上的按键做一些特殊的处理,首先要截获键盘消息,并对指定的按键做用户要求的处理,改变系统默认的处理流程。以前总以为OnChar消息函数(WM_CHAR消息)就可以完成想要的功能,其实不是这样...
  • szfhy
  • szfhy
  • 2015年10月29日 17:59
  • 452

解决子窗口(视图)截获父窗口消息的2个办法(MFC)

这样的需求: 1.如果想在CView里面截获发给子框架Frame的消息怎么办? 2.假如子窗口拆分视图了, 那还得细分, 是所有视图都想截获消息,还是某个特定的视图想截获某个特定的消息.对于需求1...
  • leolewin
  • leolewin
  • 2015年08月25日 15:48
  • 1511

获取其他程序的信息(VC实现)

介绍         最近正试着从其他程序的listview控件中获取信息,因为需要传递一个指针以便存放取得的字符串,但Windows使用的是虚拟内存,指针是不允许跨进程访问的。     ...
  • wander_wang
  • wander_wang
  • 2014年06月19日 12:52
  • 793

Windows消息大全

转自:http://www.cnblogs.com/Sunwayking/articles/2817580.html Windows窗口消息大全,全不全自己看 //////////////////...
  • zhccl
  • zhccl
  • 2014年03月21日 12:56
  • 1558

深入windows的关机消息截获-从XP到Win7的变化

之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡。之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时...
  • wenzhou1219
  • wenzhou1219
  • 2014年01月12日 15:09
  • 6198

Android Framework层如何截获按键消息

代码位置: frameworks/base/services/input/InputDispatcher.cpp
  • I2Cbus
  • I2Cbus
  • 2014年11月14日 12:44
  • 2011

ActiveX控件在IE中不响应Backspace消息

::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardHookProc, 0, GetCurrentThreadId());   LRESULT CALL...
  • dc11223344
  • dc11223344
  • 2013年12月11日 20:25
  • 853

追逐自己的梦想----------辅助制作第八课:利用SetWindowsHook将进程注入游戏主线程来解决资源冲突的问题

本节课中,我们需要学习利用SetWindowsHook来注入主线程,然后利用多线程的原理来解决资源冲突的问题。 1.注入的原因:不同的线程在访问同一个共享数据的时候,如果没有同步处理,就会造...
  • u011619422
  • u011619422
  • 2015年01月10日 11:44
  • 3276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:截获消息(2)
举报原因:
原因补充:

(最多只允许输入30个字)