od send断点 下_OD中如何下消息断点--by icefisher

本文介绍了如何在OD调试器中设置消息断点,特别是在Windows程序中,通过在WndProc函数下断点来捕获和分析消息处理流程。示例代码展示了WinMain和WndProc的基本结构,帮助理解消息处理机制。
摘要由CSDN通过智能技术生成

1 /*------------------------------------------------------------------------2 HELLOWIN.C -- Displays "Hello, Windows 98!" in client area3

4 (c) Charles Petzold, 19985

6 -----------------------------------------------------------------------*/

7

8 #include

9 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;10

11

12 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, intiCmdShow)13

14 {15

16 static TCHAR szAppName[] = TEXT ("HelloWin") ;17

18 HWND hwnd ;19

20 MSG msg ;21 //前面都是变量定义,不关注。

22

23 WNDCLASwndclass ;24

25

26 wndclass.style = CS_HREDRAW |CS_VREDRAW ;27

28 wndclass.lpfnWndProc = WndProc ; //关键句,指出消息的处理函数所在位置

29

30 wndclass.cbClsExtra = 0;31

32 wndclass.cbWndExtra = 0;33

34 wndclass.hInstance =hInstance ;35

36 wndclass.hIcon =LoadIcon (NULL, IDI_APPLICATION) ;37

38 wndclass.hCursor =LoadCursor (NULL, IDC_ARROW) ;39

40 wndclass.hbrBackground=(HBRUSH) GetStockObject (WHITE_BRUSH) ;41

42 wndclass.lpszMenuNam =NULL ;43

44 wndclass.lpszClassName=szAppName ;45

46 //这一连串的wndclass是在定义一类窗口的属性,形象地说就是在定义一个模子,然后后面可以用这个模子去建立更多的窗口,其中这个模子中我们需要注意的就是红字的 wndclass.lpfnWndProc = WndProc ;,他指出了这个模子的消息处理函数是哪个?也就是说这个窗口内发生的一切事件,比如说点击,双击,鼠标移动,按键,按下按钮这一切都会生消息,而系统会自动调用WndProc去处理这些问题。*/

47 if (!RegisterClass (&wndclass))48

49 {50

51 MessageBox ( NULL, TEXT ("This program requires Windows NT!"),52

53 szAppName, MB_ICONERROR) ;54

55 return 0;56

57 }58 //上面的是很简单的一个注册模子,你开始定义了这个模子wndclass,那你得让系统知道啊,这部分就是这个功能,不须太关注。

59 hwnd = CreateWindow( szAppName, //window class name

60

61 TEXT ("The Hello Program"), //window caption

62

63 WS_OVERLAPPEDWINDOW, //window style

64

65 CW_USEDEFAULT,//initial x position

66

67 CW_USEDEFAULT,//initial y position

68

69 CW_USEDEFAULT,//initial x size

70

71 CW_USEDEFAULT,//initial y size

72

73 NULL, //parent window handle

74

75 NULL, //window menu handle

76

77 hInstance, //program instance handle

78

79 NULL) ; //creation parameters80

81 //注意上面便是利用这个模子,再加上一些自己独有的特点建立了一个窗口,大家不需关注

82

83 ShowWindow (hwnd, iCmdShow) ;84

85 UpdateWindow (hwnd) ;86

87

88 while (GetMessage (&msg, NULL, 0, 0))89

90 {91

92 TranslateMessage (&msg) ;93

94 DispatchMessage (&msg) ;95

96 }97 //上面这个需要关注,前面提到过,如果窗口产生了消息我们需要调用WndProc来处理,那么之前我们需要上面的哪个while循环先处理下,这个现在我们也不需要了解。

98 returnmsg.wParam ;99

100 }101

102

103 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)104 {105

106 HDC hdc ;107

108 PAINTSTRUCT ps ;109

110 RECT rect ;111

112 //重点来了,大家注意当我们到了WndProc这个消息处理函数中时,我们会不自然地想到:那么多种的消息,系统如何分辨是那个呢,这是我们就要注意到UINT message,他说明了消息的种类,而WPARAM,LPARAM都是消息具体的参数,大家这时看下面,因为message表示的消息不同,系统使用了switch来选择对应的处理程序,这里要注意WM_CREATE:像这些WM_开头的都是消息,而实质上都是数字,不过是头文件定义了一些等价字符串而已。

113 switch(message)114

115 {116

117 caseWM_CREATE:118

119 PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME |SND_ASYNC) ;120

121 return 0;122

123 caseWM_PAINT:124

125 hdc = BeginPaint (hwnd, &ps) ;126

127 GetClientRect (hwnd, &rect) ;128

129 DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,130

131 DT_SINGLELINE | DT_CENTER |DT_VCENTER) ;132

133 EndPaint (hwnd, &ps) ;134

135 return 0;136

137 caseWM_DESTROY:138

139 PostQuitMessage (0) ;140

141 return 0;142 }143 returnDefWindowProc (hwnd, message, wParam, lParam) ;144 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值