API Hook,请问谁能提供

Corny 2002-12-21 12:57:24
为了解决Win2000下用代码设定不同的自定义纸张类型的问题,本人需要一个完全的API Hook,请问哪位仁兄能够提供

不够分再加
...全文
83 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wu_yongcai 2003-04-03
  • 打赏
  • 举报
回复
up
Corny 2002-12-23
  • 打赏
  • 举报
回复
看问题有表象和实质之分

不管你认为那是什么技术,我认为Windows除了与最底层的硬件设备直接通信外,其他的东西都是用消息实现的,不用说一个打印的属性对话框了。

也就是说,在Windows下,所有与设备有关的消息都应该是发送给VxD,再由Vxd下的代码与设备打交道,其他在这个系统下与设备通信的程序是及小的一部分,这也是Windows开放和能被广大的厂商和应用支持的原因。因为Vxd制造了隔离层。我要拦截的消息相信在vxd之前,不知道分儿是怎么看技术问题,当然这是我个人的看法,欢迎讨论。也许可以再开个贴。

MS提供给大家的可以Hook的那些东东当然肯定Hook,但Hook本身并不是什么技术,只是个概念,说明白了与DOS下的中断调用没什么本质区别。所谓的Hook链不过是中断链的一个翻版。看MS提供的资料是可能性形成一些概念,但不要被他们提供的资料迷惑,就此局限于书本上或是资料上的内容。每个公司都有一些不愿意被外人所知的东东,就象我们每个程序珍爱自己的代码一样,他们提供的资料只是到一个受限的程度,想深入就得靠我们自己了。因此要hook控制面板里的东东肯定跟hook一个鼠标消息是不同的,但他们原理一样,现在的问题是我要解决它,请大家帮忙
zyl910 2002-12-23
  • 打赏
  • 举报
回复
与Hook无关!!!
要明白每种技术的作用范围!
litsnake1 2002-12-23
  • 打赏
  • 举报
回复
同意分儿
verybigbug 2002-12-23
  • 打赏
  • 举报
回复
用DebugApiSpy程序监视调用了哪些API就可以了。
你可以在google上查找这个程序。
Corny 2002-12-22
  • 打赏
  • 举报
回复
想知道该对话框操作调用了Windows哪些DLL的哪些函数,并想知道它写了哪些文件和注册表项目,谢谢大家指教
Corny 2002-12-22
  • 打赏
  • 举报
回复
附加一个问题,我需要hook控制面板里的打印机属性对话框!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
xiaoxinghappy 2002-12-21
  • 打赏
  • 举报
回复
hook 在这里

// GetAddr.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#define DLLEXPORT __declspec(dllexport)
#pragma data_seg ("Shared")
static HWND m_hWnd = NULL;
static HHOOK m_hHook = NULL;
static HINSTANCE m_hInst = NULL;
#pragma data_seg ( )
#pragma comment(linker, "/section:Shared,rws")


extern "C" BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
m_hInst = (HINSTANCE)hModule;
return TRUE;
}


extern "C" DLLEXPORT int APIENTRY MessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSG pMsg =(PMSG) lParam;
if(nCode>0 || nCode == HC_ACTION)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
if(pMsg->wParam == 0x48)
pMsg->wParam = VK_F7;
return 0;
case WM_KEYUP:
if(pMsg->wParam == 0x48)
pMsg->wParam = VK_F7;
return 0;
}
}
return CallNextHookEx(m_hHook, nCode, wParam, lParam);
}

extern "C" DLLEXPORT BOOL InitHook()
{
if(m_hHook) return FALSE;
m_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MessageProc, m_hInst, NULL);
//MessageBox(NULL, "Init Hook successful!", "TIP",MB_OK|MB_ICONEXCLAMATION);
return (m_hHook != NULL);
}

extern "C" DLLEXPORT BOOL UninstHook()
{
if(!m_hHook) return FALSE;
if(!UnhookWindowsHookEx(m_hHook))
return FALSE;
m_hHook = NULL;
//MessageBox(NULL, "Init Hook successful!", "TIP", MB_OK);
return TRUE;
}
zyl910 2002-12-21
  • 打赏
  • 举报
回复
与Hook无关




hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息
,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。

关于HOOKS
使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使
用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链
WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOU
SE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数
队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息
,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如
果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于
某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HO
OK函数都会收到系统发送的消息)
HOOK过程
为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自
己的HOOK函数。该函数语法如下:
public function MyHook(nCode,wParam,iParam) as long
‘加入代码
end function
其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。
wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作

SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHook
Ex函数将系统消息传递给HOOK链中的下一个函数。
[注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数
中的CallNextHookEx语句将被忽略。
全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在
DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在D
LL中,也可以放置在应用程序的模块段)。
[注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其
它使用该类HOOK的应用程序产生冲突。
HOOK类型
WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK
WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在
向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调
用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含
了窗体过程处理系统消息后的一些信息。
WH_CBT Hook
系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令
前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息
队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,
告诉系统,是否继续执行上面的操作。
WH_DEBUG HOOK
系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该
HOOK决定是否让系统执行某种类型的HOOK。
WH_FOREGROUNDIDLE Hook
系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。
WH_GETMESSAGE Hook
WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序
使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。
WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记
录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用

WH_JOURNALPLAYBACK Hook
` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回
放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK
Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能
在指定线程中使用。
WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时
,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。
WH_KEYBOARD Hook
WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN
及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。
WH_MOUSE Hook
WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序
使用该HOOK监视发送到消息队列中的鼠标输入。
WH_MSGFILTER and WH_SYSMSGFILTER Hooks
WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、
对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_M
SGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则
可以在系统内监视所有应用程序的这些事件。
WH_SHELL Hook
一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或
当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。
使用HOOK
安装、消毁HOOK过程
监视系统事件

安装、消毁HOOK过程
使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK
,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。
为了安装一个全局HOOK过程,必须在应用程序外建立一个DLL,并将该HOOK函数封装到其
中,应用程序在安装全局HOOK过程时必须先得到该DLL模块的句柄。将DLL名传递给Load
Library 函数,就会得到该DLL模块的句柄;得到该句柄 后,使用GetProcAddress函数
可以得到HOOK过程的地址。最后,使用SetWindowsHookEx将HOOK过程的首址嵌入相应的
HOOK链中,SetWindowsHookEx传递一个模块句柄,它为HOOK过程的进入点,线程标识符
置为0,指出:该HOOK过程同系统中的所有线程关联。
以下是C写的例程,大家可以方便的转换为VB程序。
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;
.
.
.

hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc")
;
hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,
hkprcSysMsg, hinstDLL, 0);
xiaoxinghappy 2002-12-21
  • 打赏
  • 举报
回复
VC 6 下通过

#include "stdafx.h"
#include "resource.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
HMODULE m_hDLL = NULL;

// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

//Function Pointer
typedef BOOL (__stdcall * FINITHOOK) ();
typedef BOOL (__stdcall * FUNINSTHOOK) ();
FINITHOOK pInitHook = NULL;
FUNINSTHOOK pUninstHook = NULL;

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;

// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_GETMAIN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_GETMAIN);

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return msg.wParam;
}



//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_GETMAIN);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_GETMAIN;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}

//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, SW_HIDE);
UpdateWindow(hWnd);

return TRUE;
}

//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

switch (message)
{
case WM_CREATE:
m_hDLL = LoadLibrary("SONGCODE.Dll");
if(m_hDLL)
{
pInitHook = (FINITHOOK)GetProcAddress(m_hDLL, "InitHook");
if(pInitHook)
if(!pInitHook())
MessageBox(NULL, "±àºÅµã¸èÆô¶¯Ê§°Ü!", "Ìáʾ", MB_OK|MB_ICONEXCLAMATION);
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_SET:
if(m_hDLL)
{
pInitHook = (FINITHOOK)GetProcAddress(m_hDLL, "InitHook");
if(pInitHook)
if(!pInitHook())
MessageBox(NULL, "°²×°¹³×Óʧ°Ü!", "Ìáʾ", MB_OK|MB_ICONEXCLAMATION);
}
break;
case IDM_RESET:
if(m_hDLL)
{
pUninstHook = (FUNINSTHOOK)GetProcAddress(m_hDLL, "UninstHook");
if(pUninstHook)
if(!pUninstHook())
MessageBox(NULL, "Ð¶ÔØ¹³×Óʧ°Ü!", "Ìáʾ", MB_OK|MB_ICONEXCLAMATION);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
FreeLibrary(m_hDLL);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧