zoukankan
html css js c++ java
一段精彩的Thunk代码(转载自 chinaaspx.com)
#include
<
windows.h
>
class
ZWindow;
ZWindow
*
g_pWnd
=
NULL;
#pragma pack(push,
1
)
struct
_WndProcThunk
{
DWORD m_mov;
//
mov dword ptr [esp+0x4], pThis (esp+0x4 is hWnd)
DWORD m_this;
BYTE m_jmp;
//
jmp WndProc
DWORD m_relproc;
//
relative jmp
}
;
#pragma pack(pop)
class
WndProcThunk
{
public
:
_WndProcThunk thunk;
void
Init(WNDPROC proc,
void
*
pThis)
{
thunk.m_mov
=
0x042444C7
;
//
C7 44 24 04
thunk.m_this
=
(DWORD)pThis;
thunk.m_jmp
=
0xe9
;
thunk.m_relproc
=
(
int
)proc
-
((
int
)
this
+
sizeof
(_WndProcThunk));
//
Jump多远?
::FlushInstructionCache(GetCurrentProcess(),
&
thunk,
sizeof
(thunk));
}
}
;
class
ZWindow
{
public
:
virtual
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return
FALSE;
}
HWND m_hWnd;
WndProcThunk m_thunk;
ZWindow(HWND hWnd
=
0
) : m_hWnd(hWnd)
{ }
inline
void
Attach(HWND hWnd)
{ m_hWnd
=
hWnd; }
inline BOOL ShowWindow(
int
nCmdShow)
{
return
::ShowWindow(m_hWnd, nCmdShow); }
inline BOOL UpdateWindow()
{
return
::UpdateWindow(m_hWnd); }
inline HDC BeginPaint(LPPAINTSTRUCT ps)
{
return
::BeginPaint(m_hWnd, ps); }
inline BOOL EndPaint(LPPAINTSTRUCT ps)
{
return
::EndPaint(m_hWnd, ps); }
inline BOOL GetClientRect(LPRECT rect)
{
return
::GetClientRect(m_hWnd, rect); }
BOOL Create(LPCTSTR szClassName, LPCTSTR szTitle, HINSTANCE hInstance, HWND hWndParent
=
0
,
DWORD dwStyle
=
WS_OVERLAPPEDWINDOW, DWORD dwExStyle
=
0
, HMENU hMenu
=
0
,
int
x
=
CW_USEDEFAULT,
int
y
=
CW_USEDEFAULT,
int
nWidth
=
CW_USEDEFAULT,
int
nHeight
=
CW_USEDEFAULT)
{
m_hWnd
=
::CreateWindowEx(dwExStyle, szClassName, szTitle, dwStyle, x, y,
nWidth, nHeight, hWndParent, hMenu, hInstance, NULL);
return
m_hWnd
!=
NULL;
}
static
LRESULT CALLBACK StartWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ZWindow
*
pThis
=
g_pWnd;
pThis
->
m_hWnd
=
hWnd;
//
initilize the thunk code
pThis
->
m_thunk.Init(WindowProc, pThis);
//
get the address of thunk code
WNDPROC pProc
=
(WNDPROC)
&
(pThis
->
m_thunk.thunk);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pProc);
return
pProc(hWnd, uMsg, wParam, lParam);
}
static
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
ZWindow
*
pThis
=
(ZWindow
*
)hWnd;
if
(uMsg
==
WM_NCDESTROY)
::PostQuitMessage(
0
);
if
(
!
pThis
->
ProcessWindowMessage(pThis
->
m_hWnd, uMsg, wParam, lParam))
return
::DefWindowProc(pThis
->
m_hWnd, uMsg, wParam, lParam);
else
return
0
;
}
}
;
class
ZDriveWindow1 :
public
ZWindow
{
public
:
virtual
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
hDC
=
BeginPaint(
&
ps);
GetClientRect(
&
rect);
::SetBkMode(hDC, TRANSPARENT);
::DrawText(hDC,
"
ZDriveWindow1
"
,
-
1
,
&
rect, DT_CENTER
|
DT_VCENTER
|
DT_SINGLELINE);
EndPaint(
&
ps);
return
0
;
}
LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL,
"
ZDriveWindow1::OnLButtonDown
"
,
"
Msg
"
, MB_OK);
return
0
;
}
}
;
class
ZDriveWindow2 :
public
ZWindow
{
public
:
virtual
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
hDC
=
BeginPaint(
&
ps);
GetClientRect(
&
rect);
::SetBkMode(hDC, TRANSPARENT);
::Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom);
::DrawText(hDC,
"
ZDriveWindow2
"
,
-
1
,
&
rect, DT_CENTER
|
DT_VCENTER
|
DT_SINGLELINE);
EndPaint(
&
ps);
return
0
;
}
LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL,
"
ZDriveWindow2::OnLButtonDown
"
,
"
Msg
"
, MB_OK);
return
0
;
}
}
;
int
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int
nCmdShow)
{
char
szAppName[]
=
"
Hello world
"
;
MSG msg;
WNDCLASS wnd;
ZDriveWindow1 zwnd1;
ZDriveWindow2 zwnd2;
wnd.cbClsExtra
=
NULL;
wnd.cbWndExtra
=
NULL;
wnd.hbrBackground
=
(HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor
=
::LoadCursor(NULL, IDC_ARROW);
wnd.hIcon
=
::LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance
=
hInstance;
wnd.lpfnWndProc
=
ZWindow::StartWndProc;
wnd.lpszClassName
=
szAppName;
wnd.lpszMenuName
=
NULL;
wnd.style
=
CS_HREDRAW
|
CS_VREDRAW;
if
(
!
RegisterClass(
&
wnd))
{
::MessageBox(NULL,
"
Can not register window class
"
,
"
Error
"
, MB_OK
|
MB_ICONINFORMATION);
return
-
1
;
}
g_pWnd
=
&
zwnd1;
zwnd1.Create(szAppName,
"
Hell world
"
, hInstance);
zwnd1.ShowWindow(nCmdShow);
zwnd1.UpdateWindow();
g_pWnd
=
&
zwnd2;
zwnd2.Create(szAppName,
"
Test
"
, hInstance, zwnd1.m_hWnd,
WS_VISIBLE
|
WS_CHILD
|
ES_MULTILINE, NULL, NULL,
0
,
0
,
150
,
150
);
zwnd2.ShowWindow(nCmdShow);
while
(::GetMessage(
&
msg, NULL,
0
,
0
))
{
DispatchMessage(
&
msg);
}
return
msg.wParam;
}
BOOL ZDriveWindow1::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch
(uMsg)
{
case
WM_LBUTTONDOWN:
OnLButtonDown(wParam, lParam);
break
;
case
WM_PAINT:
OnPaint(wParam, lParam);
break
;
}
return
FALSE;
}
BOOL ZDriveWindow2::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch
(uMsg)
{
case
WM_LBUTTONDOWN:
OnLButtonDown(wParam, lParam);
break
;
case
WM_PAINT:
OnPaint(wParam, lParam);
break
;
}
return
FALSE;
}
查看全文
相关阅读:
SQL表结构
Mssql 行转列
动态Order by
Nopi Excel导入
使用SyncToy 同步两台机器上的文件夹
ueditor1.4.3 在IE8下的 BUG
WebService国内省市县接口
AsyncTask的参数介绍
Json分割并解析
JQuery iframe页面操作父页面中的元素与方法
原文地址:https://www.cnblogs.com/xiaotaoliang/p/235586.html
最新文章
去除word文档页眉处的横杠
Python调用函数加括号和不加括号的区别
Consul安装集群搭建
Python-webbrowser实现自动打开关、定时打开关闭网页/刷新网页
使用springcloud开发测试问题总结
最新开源跳板机(堡垒机)系统 Jumpserver介绍
if语句的一个小技巧
进制转换及API接口中的转换
AB窗体互传参数本质
如何阅读源码(转载)
热门文章
Graphics平移缩放旋转(转载)+点睛
dataGridViewX和数据库的链接之dataGridViewX1.DataSource = ds.Tables[0];
List 用法和实例(转载)
串口通信本质及中16进制转10进制
[C#] Control.Invoke方法和跨线程访问控件(转载)
C# 的Brush 及相关颜色的操作 (并不是全转)
批量 更新 Update Select
Request.QueryString.Get有时获取不到参数时
Cell
Input 只能输入数字与小数点
Copyright © 2011-2022 走看看