delphi初级教程之delphi断点调试一

mikel阅读(1136)

所谓断点,就是在程序代码的某一行上设置一个标记,程序执行到这里将暂停,由调 试器接管对程序的控制。使用断点与使用【Runto Cursor】命令有些相似,都是执行到某 一行后暂停。不同的是,程序中可以设置多个断点并且能够给断点设置条件。

断点通常设置在有疑点的区域。在遇到断点之前,程序以全速运行。遇到断点之后,程序暂时停止运行,以后就可以单步或跟踪执行程序。

一、源代码断点

要在代码编辑器中设置源代码断点,有以下 4 种操作方式。

(1)  把光标移到要设为断点的行上,按下 F5 键。

(2)  用鼠标左键单击要设为断点的行的最左端。

(3) 用鼠标右键单击要设为断点的行,在弹出的菜单中选择【Debug】命令,再选择【ToggleBreakpoint】。

(4)  使用【Run】菜单中的【Add Breakpoint】 命令,再选择【SourceBreakpoint】,Delphi 将 打开【Add Source Breakpoint】对话框,如图 源代码断点1所示。

【Filename】框用于输入断点所在的源文件名(包含路径)。

【Line number】框用于输入断点所在的行号。

【Condition】框用于设置断点有效的条件,通常是一个布尔表达式。布尔表达式中可 以包含函数调用,只要该函数返回布尔值即可。

当程序执行到这个断点时,首先计算该布尔表达式的值。如果值为 True,则断点有效, 程序将暂停运行。如果值为 False,则断点无效,程序将继续执行。

【Pass count】框用于指定经过断点多少次后断点有效。例如,在一个 For 循环中设置 一个断点,每次循环时都会遇到这个断点。但并非每次遇到断点时程序都会暂停,因为还需要经过一定次数后断点才有效。

【Group】框用于对断点进行分组。可以在这个框内输入一个新的组名,也可以选择一 个已有的组名。一旦若干个断点编成组,就可以分别使用【Disable Group】命令和【Enable Group】命令成组地被禁止或允许它们,还可以给一组断点指定一系列动作。

注意:设为断点的行必须是可执行的代码行。如果把断点设在注释行、空行、变量声明的行上,调试器将认为断点无效。

默认情况下,断点所在的行用白底红字显示,并且在装订区有一个红色的小圆圈。如图 源代码断点2所示。

                      源代码断点1

                      源代码断点2

当鼠标指向这个小圆圈时,将弹出一个提示窗口,显示断点的条件和经过次数。

二、机器指令断点

Delphi 允许针对某个机器指令设断点。当程序执行到这个指令时,就会暂停(必须执行到 断点处设置)。要设置机器指令断点,有下列几种方式。

(1)  在 CPU 窗口中用鼠标左键单击某个指令 的装订区。

(2)  在 CPU  窗口中选择一个指令,然后按F5键。

(3)  在 CPU 窗口中用鼠标右键单击某个指令, 在弹出的菜单中选择【Toggle breakpoint】命令。

(4)  使用【Run】菜单中的【Add Breakpoint】命令,再选择【Address Breakpoint】,弹出【Add Address Breakpoint】对话框,如图 机器断点1所示。

                  机器断点1

三、数据断点

Delphi 能够监视指针错误。如果内存的某个地址被改写,程序就会暂停,由调试器接管控制权,就好 像遇到断点一样。

要设置这样的断点,可以使用【Run】菜单中的【Add Breakpoint】命令,再选择【Data Breakpoint】, 出现【Add Data Breakpoint】对话框,如图 数据断点1所示。

【Address】框用于指定要监视的内存地址。可以键入一个变量名。

【Length】框用于指定数据的长度(字节数)。如果 在【Address】框中键入的是一个变量名,则【Length】


图  数据断点1   【Add Data Breakpoint】对话框框可以空白,因为 Delphi 会自动计算出该变量的长度。

【Condition】框用于设置断点有效的条件,通常是一个布尔表达式。

【Pass count】框用于指定经过断点多少次后断点有效。

【Group】框用于把断点进行分组。 要说明的是,当本次调试结束时,所有的数据断点都会被禁止。下次调试时,如果还要用到这些数据断点,需要使它们有效。

Delphi对ini文件的操作

mikel阅读(1172)

一、INI文件的结构:
; 注释
[小节名]
关键字=值

INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值。
值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示。
注释以分号“;”开头。

二、定义
1、在Interface的Uses节增加IniFiles;
2、在Var变量定义部分增加一行:
myinifile:Tinifile;
然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。

三、打开INI文件

Filename:=ExtractFilePath(Paramstr(0))+’program.ini’;
myinifile:=Tinifile.Create(filename);

四、读取关键字的值

针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。
vs:=myinifile.Readstring(’小节名’,’关键字’,缺省值); string类型

vi:=myinifile.Readinteger(’小节名’,’关键字’,缺省值);integer类型

vb:=myinifile.Readbool(’小节名’,’关键字’,缺省值);   boolean类型

五、写入INI文件

myinifile.writestring(’小节名’,’关键字’,变量或字符串值); string类型

myinifile.writeinteger(’小节名’,’关键字’,变量或整型数值);integer类

myinifile.writebool(’小节名’,’关键字’,变量或True或False);boolean类型

当这个INI文件不存在时,上面的语句还会自动创建该INI文件。

六、删除关键字

myinifile.DeleteKey(’小节名’,’关键字’);

七、小节操作

增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法:myinifile.EraseSection(’小节名’);另外Tinifile类还提供了三种对象方法来对小节进行操作:

myinifile.readsection(’小节名’,TStrings变量);

可将指定小节中的所有关键字名读取至一个字符串列表变量中;

myinifile.readsections(TStrings变量);

可将INI文件中所有小节名读取至一个字符串列表变量中去。

myinifile.readsectionvalues(’小节名’,TStrings变量);

可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。

八、释放

在适当的位置用下面的语句释放myinifile:

myinifile.distory;

九 Delphi内置函数总结

利用Windows API函数WritePrivateProfileString 和GetPrivateProfileString可对.INI文件进行读写操作。其实,对.INI文件的读写完全可以利用Delphi的内置函数来实 现。下面就介绍一些对.INI文件读写时相关的类及其属性方法。

1、TIniFile对象

以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。

2、Create方法

该方法用来创建一个处理INI文件的TIniFile类型实例。

方法声明:constructor Create(const FileName:string);

参数说明:FileName指明待创建的INI文件的文件名;

注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所 在目录(一般就是C:windows,对于Windows NT来说,则一般是c:winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。

3、ReadSection方法

该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。

方法声明:procedure ReadSection(const Section:string; Strings:TStrings);

参数说明:Section指明要读取段的段名;

Strings指明存放子键名的字符串列表;

注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。

4、ReadSections方法

该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。

方法声明:procedure ReadSections(Strings:TStrings);

参数说明:Strings参数指明存放段名的字符串列表;

注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。

5、ReadSectionValues方法

该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。

方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings);

参数说明:Section指明要读取段的段名;

Strings指明存放段名的字符串列表;

注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即”Key=Value”形式。

6、EraseSection方法

该方法删除INI文件中指定的一个整段。

方法声明:procedure EraseSection(const Section:string);

参数说明:Section指明待删除段的段名;

注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。

7、DeleteKey方法

该方法删除指定段中的某个指定的子键。

方法声明:procedure DeleteKey(const Section,Key:string);

参数说明:Section指明待删除子键据段的段名;

Key指明待删除子键的键名;

注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。

8、ReadBool方法

该方法读取指定段的某个子键的布尔值。

方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean;

参数说明:Section指明待读子键所在段的段名;

Key指明待读子键的键名;

Default参数指明缺省时的返回值。

注释:ReadBool方法用于读取一个子键的布尔型值,当键值为”1″时,返回True,键值为”0″时,返回False.

9、WriteBool方法

该方法向指定段的某个子键写入布尔值。

方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean);

参数说明:Senction指明待写入子键所在段的段名;

Key参数指明待写入值的子键键名;

Value指明待写入的布尔值;

注释:WriteBool 方法用于写入一个子键的布尔值,当Value为”True”时,写入”1″。Value为”Flase”时,写入”0″。若在写入时,指定的段或键名不存在,则自动创建该段和键名。

10、ReadInteger方法

该方法读取指定段的某个子键的整型值。

方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint;

注释:此方法与ReadBool方法类似,只是变量类型不同。

11、WriteInteger方法

该方法向指写段的某个子键写放整型值。

方法声明:procedure WriteInteger(const Section,Key:string; Value:longint);

注释:此方法与WriteBool方法类似,只是变量灰型不同。

12、ReadString方法

该方法读取指定段的某个子键的字符串型 值。

方法声明:function ReadString(const Section,Key:string; Default:string):string;

注释;此方法与ReadBool方法类似,只是变量类型不同。

13、WriteString方法

该方法向指写段的某个子键写入整型值。

方法声明:procedure WriteString(const Section,Key:string; Value:string);

注释:此方法与WriteBool方法类似,只是变量类型不同。

14、FileName属性

该属性指明被封装在TIniFile对象中的INI文件的文件名。

属性声明:property FileName:string;

注释:FileName属性是一个运行时的只读属性。

由一面的介绍,我们可以看到,强大的Delphi对INI文件的支持是非常全面的。我们在编写涉及此类操作的程序时,几乎无需使用Windows API函数

delphi 键盘键值对照表_JamesZhou_新浪博客,JamesZhou,

mikel阅读(1255)

delphi 键盘键值对照表_JamesZhou_新浪博客,JamesZhou,

常数名称 十六进制值 十进制值 对应按键
VK_LBUTTON 01 1 鼠标的左键
VK_RBUTTON 02 2 鼠标的右键
VK-CANCEL 03 3 Ctrl+Break(通常不需要处理)
VK_MBUTTON 04 4 鼠标的中键(三按键鼠标)
VK_BACK 08 8 Backspace键
VK_TAB 09 9 Tab键
VK_CLEAR 0C 12 Clear键(Num Lock关闭时的数字键盘5)
VK_RETURN 0D 13 Enter键
VK_SHIFT 10 16 Shift键
VK_CONTROL 11 17 Ctrl键
VK_MENU 12 18 Alt键
VK_PAUSE 13 19 Pause键
VK_CAPITAL 14 20 Caps Lock键
VK_ESCAPE 1B 27 Ese键
VK_SPACE 20 32 Spacebar键
VK_PRIOR 21 33 Page Up键
VK_NEXT 22 34 Page Domw键
VK_END 23 35 End键
VK_HOME 24 36 Home键
VK_LEFT 25 37 LEFT ARROW 键(←)
VK_UP 26 38 UP ARROW键(↑)
VK_RIGHT 27 39 RIGHT ARROW键(→)
VK_DOWN 28 40 DOWN ARROW键(↓)
VK_Select 29 41 Select键
VK_PRINT 2A 42  
VK_EXECUTE 2B 43 EXECUTE键
VK_SNAPSHOT 2C 44 Print Screen键(抓屏)
VK_Insert 2D 45 Ins键(Num Lock关闭时的数字键盘0)
VK_Delete 2E 46 Del键(Num Lock关闭时的数字键盘.)
VK_HELP 2F 47 Help键
VK_0 30 48 0键
VK_1 31 49 1键
VK_2 32 50 2键
VK_3 33 51 3键
VK_4 34 52 4键
VK_5 35 53 5键
VK_6 36 54 6键
VK_7 37 55 7键
VK_8 38 56 8键
VK_9 39 57 9键
VK_A 41 65 A键
VK_B 42 66 B键
VK_C 43 67 C键
VK_D 44 68 D键
VK_E 45 69 E键
VK_F 46 70 F键
VK_G 47 71 G键
VK_H 48 72 H键
VK_I 49 73 I键
VK_J 4A 74 J键
VK_K 4B 75 K键
VK_L 4C 76 L键
VK_M 4D 77 M键
VK_N 4E 78 N键
VK_O 4F 79 O键
VK_P 50 80 P键
VK_Q 51 81 Q键
VK_R 52 82 R键
VK_S 53 83 S键
VK_T 54 84 T键
VK_U 55 85 U键
VK_V 56 86 V键
VK_W 57 87 W键
VK_X 58 88 X键
VK_Y 59 89 Y键
VK_Z 5A 90 Z键
VK_NUMPAD0 60 96 数字键0键
VK_NUMPAD1 61 97 数字键1键
VK_NUMPAD2 62 98 数字键2键
VK_NUMPAD3 62 99 数字键3键
VK_NUMPAD4 64 100 数字键4键
VK_NUMPAD5 65 101 数字键5键
VK_NUMPAD6 66 102 数字键6键
VK_NUMPAD7 67 103 数字键7键
VK_NUMPAD8 68 104 数字键8键
VK_NUMPAD9 69 105 数字键9键
VK_MULTIPLY 6A 106 数字键盘上的*键
VK_ADD 6B 107 数字键盘上的+键
VK_SEPARATOR 6C 108 Separator键
VK_SUBTRACT 6D 109 数字键盘上的-键
VK_DECIMAL 6E 110 数字键盘上的.键
VK_DIVIDE 6F 111 数字键盘上的/键
VK_F1 70 112 F1键
VK_F2 71 113 F2键
VK_F3 72 114 F3键
VK_F4 73 115 F4键
VK_F5 74 116 F5键
VK_F6 75 117 F6键
VK_F7 76 118 F7键
VK_F8 77 119 F8键
VK_F9 78 120 F9键
VK_F10 79 121 F10键
VK_F11 7A 122 F11键
VK_F12 7B 123 F12键
VK_NUMLOCK 90 144 Num Lock 键
VK_SCROLL 91 145 Scroll Lock键
       
上面没有提到的:(都在大键盘)      
VK_LWIN   91 左win键
VK_RWIN   92 右win键
VK_APPS   93 右Ctrl左边键,点击相当于点击鼠标右键,会弹出快捷菜单
    186 ;(分号)
    187 =键
    188 ,键(逗号)
    189 -键(减号)
    190 .键(句号)
    191 /键
    192 `键(Esc下面)
    219 [键
    220 \键
    221 ]键
    222 ‘键(引号)

delphi虚拟键码对应关键

VK_LBUTTON鼠标左键

VK_RBUTTON鼠标右键

VK_CANCEL控制+休息

VK_MBUTTON鼠标中键

VK_BACK Backspace键

VK_TAB Tab键

VK_CLEAR清除主要

VK_RETURN Enter键

VK_SHIFT Shift键

VK_CONTROL Ctrl键

VK_MENU Alt键

VK_PAUSE暂停关键

VK_CAPITAL Caps Lock键

VK_KANA可与输入法

VK_HANGUL可与输入法

VK_JUNJA可与输入法

VK_FINAL可与输入法

VK_HANJA可与输入法

VK_KANJI可与输入法

VK_CONVERT可与输入法

VK_NONCONVERT可与输入法

VK_ACCEPT可与输入法

VK_MODECHANGE可与输入法

VK_ESCAPE Esc键

VK_SPACE空间酒吧

VK_PRIOR页键

VK_NEXT下一页关键

VK_END END键

VK_HOME主页关键

VK_LEFT左箭头键

VK_UP向上键

VK_RIGHT右箭头键

VK_DOWN下箭头键

VK_SELECT选择关键

VK_PRINT打印键(键盘的具体)

VK_EXECUTE执行关键

VK_SNAPSHOT Print Screen键

VK_INSERT插入关键

VK_DELETE Delete键

VK_HELP帮助关键

VK_LWIN左Windows键(微软键盘)

VK_RWIN右Windows键(微软键盘)

VK_APPS应用关键(微软键盘)

VK_NUMPAD0 0键(数字键盘)

VK_NUMPAD1 1键(数字键盘)

VK_NUMPAD2 2键(数字键盘)

VK_NUMPAD3 3键(数字键盘)

VK_NUMPAD4 4键(数字键盘)

VK_NUMPAD5 5键(数字键盘)

VK_NUMPAD6 6键(数字键盘)

VK_NUMPAD7 7键(数字键盘)

VK_NUMPAD8 8键(数字键盘)

VK_NUMPAD9 9键(数字键盘)

VK_MULTIPLY多键(数字键盘)

VK_ADD添加键(数字键盘)

VK_SEPARATOR分离键(数字键盘)

VK_SUBTRACT减去键(数字键盘)

VK_DECIMAL小数点键(数字键盘)

VK_DIVIDE鸿沟键(数字键盘)

VK_F1 F1键

VK_F2 F2键

VK_F3 F3的关键

VK_F4 F4键

VK_F5 F5键

VK_F6 F6键

VK_F7 F7键

VK_F8 F8键

VK_F9 F9键

VK_F10 F10键关键

VK_F11 F11键

VK_F12 F12键

VK_F13 F13键

VK_F14 F14键

VK_F15 F15键

VK_F16 F16键

VK_F17 F17键

VK_F18 F18键

VK_F19 F19键

VK_F20 F20键

VK_F21 F21键

VK_F22 F22键

VK_F23 F23键

VK_F24 F24键

VK_NUMLOCK数Lock键

VK_SCROLL滚动Lock键

VK_LSHIFT左Shift键(仅用于GetAsyncKeyState和GetKeyState )

VK_RSHIFT右Shift键(仅用于GetAsyncKeyState和GetKeyState )

VK_LCONTROL左Ctrl键(仅用于GetAsyncKeyState和GetKeyState )

VK_RCONTROL右Ctrl键(仅用于GetAsyncKeyState和GetKeyState )

VK_LMENU左Alt键(仅用于GetAsyncKeyState和GetKeyState )

VK_RMENU右Alt键(仅用于GetAsyncKeyState和GetKeyState )

VK_PROCESSKEY工艺关键

VK_ATTN经办关键

VK_CRSEL CrSel关键

VK_EXSEL ExSel关键

VK_EREOF擦除EOF分析关键

VK_PLAY发挥关键

VK_ZOOM变焦关键

VK_NONAME保留以供将来使用

VK_PA1 PA1关键

VK_OEM_CLEAR清除主要标签数: 1 “ F14键

VK_F15 F15键

VK_F16 F16键

VK_F17 F17键

VK_F18 F18键

VK_F19 F19键

VK_F20 F20键

VK_F21 F21键

VK_F22 F22键

VK_F23 F23键

VK_F24 F24键

VK_NUMLOCK数Lock键

VK_SCROLL滚动Lock键

VK_LSHIFT左Shift键(仅用于GetAsyncKeyState和GetKeyState )

VK_RSHIFT右Shift键(仅用于GetAsyncKeyState和GetKeyState )

VK_LCONTROL左Ctrl键(仅用于GetAsyncKeyState和GetKeyState )

VK_RCONTROL右Ctrl键(仅用于GetAsyncKeyState和GetKeyState )

VK_LMENU左Alt键(仅用于GetAsyncKeyState和GetKeyState )

VK_RMENU右Alt键(仅用于GetAsyncKeyState和GetKeyState )

VK_PROCESSKEY工艺关键

VK_ATTN经办关键

VK_CRSEL CrSel关键

VK_EXSEL ExSel关键

VK_EREOF擦除EOF分析关键

VK_PLAY发挥关键

VK_ZOOM变焦关键

VK_NONAME保留以供将来使用

VK_PA1 PA1关键

VK_OEM_CLEAR清除主要

DELPHI 注册全局热键

mikel阅读(1104)

DELPHI 注册全局热键_長空飛雪_新浪博客,長空飛雪,

全局热键的意思是指,当程序并不是当前窗口的时候,按下热键也可以响应。

以前做这种功能用过一种方法,是编写一个键盘钩子的DLL,过滤系统中所有的键盘消息,当然还要再写一个程序去调用它。这种方法做起来麻烦了一起,不过倒是黑客窃取键盘密码雏形。

这里介绍的方法是利用windows api直接注册热键,分三步走:
1、增加一个全局Atom
2、为Atom注册一个全局热键(这样相应的键盘消息就会分配给本程序了)
3、写相应的HotKey响应处理代码

再进一步,如果需要让用户自定义热键,就需要在界面上放一个标准的THotKey控件,这个控件允许用户自己输入热键,不过它的输出是TShortCut,在Menus单元中有几个函数(ShortCutToKey, ShortCutToText)可以把TShortCut转换成文本和其他类型。

全部代码如下

 程序代码

uses
…, Menus;

type
TForm1 = class(TForm)
  
private
   HotKey_Key: Word;
   HotKey_Shift: Word;
   Aatom: Atom;
   procedure HotKey(var Msg: TMessage); message WM_HOTKEY;     //定义全局热键消息事件
  
end;

….

procedure TForm1.FormCreate(Sender: TObject);
begin
Aatom := GlobalAddAtom(‘MYHOTKEY’);               //全局热键ID
GetHotKey(HotKey1.HotKey);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, Aatom); //反注册全局热键
GlobalDeleteAtom(Aatom);
end;

procedure TForm1.HotKey(var Msg: TMessage);        //热键响应事件
begin
if ((Msg.LParamHi = HotKey_Key) and (Msg.LParamLo = HotKey_Shift)) then    //全局热键
begin
   ShowMessage(‘Hot Key Pressed!’);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);  //注册热键
var
T: TShiftState;
function ShiftStateToWord(Shift:TShiftState): Word;
begin
   if ssShift in Shift then Result :=MOD_SHIFT else Result := 0;
   if ssCtrl in Shift then Result :=Result or MOD_CONTROL;
   if ssAlt in Shift then Result:=Result or MOD_ALT;
end;
begin
ShortCutToKey(HotKey1.HotKey, HotKey_Key, T);
HotKey_Shift := ShiftStateToWord(T);

RegisterHotKey(Handle, Aatom, HotKey_Shift, HotKey_Key); //注册全局热键
end;

Delphi全局热键的注册

mikel阅读(1474)

1.在窗启动时创建ATOM;(aatom:ATOM;定义在private中)

复制代码
1   if FindAtom('ZWXhotKey')=0 then
2   begin
3     aatom:=GlobalAddAtom('ZWXhotKey');
4   end;
5   if RegisterHotKey(Handle,aatom,MOD_ALT,$41) then
6   begin
7     MessageBox(Handle,'按alt+a','提示',MB_OK);
8   end;
复制代码

 

2.定义处理热键的消息过程(定义在private中,下面二个处理消息的过程是一样的)

1     procedure hotkey(var msg:TMessage);message WM_HOTKEY;//定义全局热键消息事件
2   //procedure hotkey2(var msg:TWMHotKey);message WM_HOTKEY;//同上

3.消息过程的处理(下面二个IF任选一个即可,如果msg在步骤2定义成TWMHotKey,则不用转换)

复制代码
 1 procedure TForm2.hotkey(var msg: TMessage);
 2 begin
 3   if TWMHotKey(msg).HotKey=aatom then
 4   begin
 5     //ShowMessage('s');
 6   end;
 7   if (msg.LParamHi=$41) and (msg.LParamLo=MOD_ALT) then
 8   begin
       //處理事情
13   end;
14 end;
复制代码

4.程序关闭时,刪除热键和原子

1 procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
2 begin
3   UnregisterHotKey(Handle,aatom);
4   GlobalDeleteAtom(aatom);
5

Delphi : GetWindowRect获取窗口矩形坐标,SetCursorPos设置鼠标位置

mikel阅读(1550)

Delphi : GetWindowRect获取窗口矩形坐标,SetCursorPos设置鼠标位置_硬软兼得_新浪博客,硬软兼得,1)、GetWindowRect,用于取窗口矩形坐标。返回值类型:布尔型(LongBool)。执行成功返回真(True),否则返回假 (False);参数1类型:整数型(HWND),目标窗口的窗口句柄;参数2类型:坐标结构(RECT),目标窗口的坐标结构地址。在Windows SDK中的函数原型:
BOOL GetWindowRect(
   HWND hWnd, // handle of window       参数1:目标窗口句柄
   LPRECT lpRect  // address of structure for window coordinates 参数2:窗口的坐标结构地址
  );

RECT定义:

typedef struct _RECT {    // rc 
   LONG left;        //桌面窗口到目标窗口的左边距
   LONG top;        //桌面窗口到目标窗口的顶边距
   LONG right;      //桌面窗口到目标窗口的右边距
   LONG bottom;  //桌面窗口到目标窗口的底边距
} RECT;

(2)、SetCursorPos,用于设置鼠标当前位置。返回值类型:布尔型(LongBool)。执行成功返回真(True),否则返回假 (False);参数1类型:整数型(Integer),水平位置X;参数2类型:整数型(Integer),垂直位置Y。在Windows SDK中的函数原型:
BOOL SetCursorPos(

   int X, // horizontal position  参数1:水平位置
   int Y  // vertical position      参数2:垂直位置
  );

(3)、mouse_event,用于模拟鼠标动作。无返回值。参数1类型:整数型(Integer),鼠标动作标识;参数2类型:整数型 (Integer),鼠标动作的水平坐标X;参数3类型:整数型(Integer),鼠标动作的垂直坐标Y;参数4类型:整数型(Integer),鼠标 滚轮转动方向,若当前鼠标无滚轮动作,则取值为0;参数5在Windows SDK中的函数原型:
VOID mouse_event(

   DWORD dwFlags, // flags specifying various motion/click variants 鼠标动作标识
   DWORD dx, // horizontal mouse position or position change 鼠标动作的水平坐标
   DWORD dy, // vertical mouse position or position change 鼠标动作垂直坐标
   DWORD dwData, // amount of wheel movement 当鼠标动作标识为MOUSEEVENTF_WHEEL时,此参数为鼠标滚轮转动方向,正值表示滚轮向前旋转,远离用户;负值表示滚轮向后旋转,向用户。
   DWORD dwExtraInfo  // 32 bits of application-defined information 设定一个32位值用于取扩展信息
  );

鼠标动作标识:

MOUSEEVENTF_MOVE            = $0001; { mouse move 鼠标移动}
MOUSEEVENTF_LEFTDOWN        = $0002; { left button down 左键按下}
MOUSEEVENTF_LEFTUP          = $0004; { left button up 左键弹起}
MOUSEEVENTF_RIGHTDOWN       = $0008; { right button down 右键按下}
MOUSEEVENTF_RIGHTUP         = $0010; { right button up 右键弹起}
MOUSEEVENTF_MIDDLEDOWN      = $0020; { middle button down 中间按下}
MOUSEEVENTF_MIDDLEUP        = $0040; { middle button up 中键弹起}
MOUSEEVENTF_WHEEL           = $0800; { wheel button rolled 滚轮移动}
MOUSEEVENTF_ABSOLUTE        = $8000; { absolute move 绝对移动}

2、认识Delphi函数:IntToStr,用于整数数值转换为字符串。返回值类型:字符型(string),函数执行成功返回指定十进制数值的十进制字符串型;参数类型:整数型(Integer),目标数值的十进制数值。函数原型:
function IntToStr(
Value: Integer;  //参数:要转换的十进制数值
): string;

源码:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
   lb1: TLabel;
   edt1: TEdit;
   btn1: TButton;
   lb2: TLabel;
   procedure btn1Click(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
ck_hwnd:HWND;
ck_R:TRect;
begin
ck_hwnd:=FindWindow(‘SciCalc’,’计算器’);
edt1.Text := IntToHex(ck_hwnd,8);
GetWindowRect(ck_hwnd,ck_R);
lb2.Caption := IntToStr(ck_r.Left)+’,’+ IntToStr(ck_R.Top)+’/’+
IntToStr(ck_R.Right)+ ‘,’+ IntToStr(ck_R.Bottom );
//实现按下数字键8
SetCursorPos(350+ ck_R.Left ,150+ ck_R.Top )  ;
mouse_event(MOUSEEVENTF_LEFTDOWN,350+ ck_R.Left,150+ ck_R.Top,0,0);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTUP,350+ ck_R.Left,150+ ck_R.Top,0,0);

end;

end.

php之Deprecated: Function ereg_replace() is deprecated的解决方法

mikel阅读(837)

php之Deprecated: Function ereg_replace() is deprecated的解决方法_又见流星_新浪博客,又见流星,

这个问题是因为php版本过高。

在php5.3中,正则函数ereg_replace已经废弃,而dedecms还继续用。有两个方案可以解决以上问题:

1、把php版本换到v5.3下。

2、继续使用v5.3,修改php.ini文件

;extension=php_mbstring.dll

改为

extension=php_mbstring.dll

;mbstring.func_overload = 0

修改为:

mbstring.func_overload = 7

或者使用其他的函数:

define(‘DEDEADMIN’, ereg_replace(“[/\\]{1,}”, ‘/’, dirname(__FILE__) ) );
//改为
define(‘DEDEADMIN’, preg_replace(“/[\/\\\\]{1,}/”, ‘/’, dirname(__FILE__) ) );

注:因为preg_replace比ereg_replace的执行速度快,PHP推荐使用preg_replace.

warning: strtotime(): It is not safe to rely on the system's timezone settings

mikel阅读(782)

warning: strtotime(): It is not safe to rely on the system’s timezone settings
出现这个错误的原因,主要是因为php.ini里面的时区没有进行设置,可以设置一下,例如:
vi /etc/php.ini
然后找到timezone
将时区设为,例如:Asia/Shanghai

PS: 本来以为通过上述的方式是可以解决问题的,但是经测试,在php5.3版本下,并不能解决问题。

具体操作方式如下:
1、在php配置文件中添加timezone的配置(参照debian的配置规则,添加小的配置规则文件即可,好维护,自定义性好)
~# vim /etc/php/cli-php5.3/ext-active/date_timezone.ini
date.timezone = “Asia/Shanghai”
~ # env-update
~ # source /etc/profile
自定义的文件放在cli-php5.3/ext-active目录中,是因为php默认是采用cli方式,另外ext-active目录是表示启用特性的专用目录,这个可以从/etc/env.d/20php5.3文件中看出来
MANPATH=”/usr/lib/php5.3/man/”
CONFIG_PROTECT_MASK=”/etc/php/cli-php5.3/ext-active/ /etc/php/cgi-php5.3/ext-active/ /etc/php/apache2-php5.3/ext-active/”
2、在出现错误提示的php文件中添加date_default_timezone_set(‘Asia/Shanghai’);位置是在<?php   ?>中
注:
在 某些参考资料中是说这两个方法任选其一就可,但经我测试,必须两个方法同时使用,才不会再出现错误提示。经实测其实第二个方法并不需要在每个出现错误提示 的PHP文件中添加,只需在其中一个PHP文件中添加即可。另外添加的时区不需要与提示中的时区一样,比如系统给我的提示是Chongqing,但我设置 成Shanghai也是一样的,当然这个时间也是与我系统的时区设置是一样的。

phpMyAdmin“无法载入mysql扩展,请检查PHP配置

mikel阅读(1006)

phpMyAdmin“无法载入mySQL扩展,请检查PHP配置

以下是内容:

就是上边这行提示,MB的,俺检查php.ini,看了30次以上,带病整配置,整整花了有2个小时,最后才搞定它。在崩溃的边缘。。。

说说遇到这个问题的情况和处理过程,安装好php,测试一切正常,然后又装了ZEND,再装了MYSQL,接着装phpmyadmin,然后在IIS加个 虚拟机目录给phpmyadmin,浏览器打开连接测试,问题就出现了,提示:phpMyAdmin“无法载入mySQL扩展,请检查PHP配置。印象上 次好象也是这个提示,然后就上baidu查了下总结出了以下4种情况会造成出错:

1.在C:\windows目录下的php.ini文件中,没有将“;extension=php_mysql.dll”中的前面一个“;”去掉.

2.修改 extension_dir = 和PHP实际的ext目录(扩展php_mysql.dll 的路径)不一致。

3. 把PHP目录和ext目录添加到环境变量中。方法是:桌面>我的电脑>右键属性>高级>环境变量>系统变量>新建 建立一个(名:如phprc)(值:即指定到磁盘路径:/php/ext目录下)

4、在系统的 system32(C:\windows\system32) 目录下缺少 libmysql.dll文件,解决方法是找到php目录下的libmysql.dll,并将libmysql.dll复制到C:\windows \system32目录中,然后重新启动Web服务。

但是以上4个方法,我就第3个没做,其他全一样,就怀疑是不是第3个原因,就添加到环境变量试下,结果还是那个提示。这时候已经火得不行了,TMD。

不行,在继续baidu下,找啊找啊找,在第4页翻到个内容,也是说按上面方法不行,最后也搞定了,这下希望来了,看完后,发现他还把 php_mysql.dll 也 复制到c:/windows/system32目录,我倒没有复制这个过去,只能再次试试看,COPY过去后,重起IIS。然后再连下,一样的提示。 FUCK~难道这就是传说中的RPWT。这时候我把IIS重起下。重起后,竟然连上了 – – MD啊  发现重起是多么的重要啊~

    后来查询了相应的PHP文档,结合自己的理解分析。可能的原因是这样的,在PHP4以前的版本,MySQL是作为一个独立的程序运行的,因此MySQL的文档和网友中很多提示应该将libmysql.dll文件复制到%SystemRoot%中,其实在PHP5以 后的版本中,MySQL是作为PHP的一个插件来运行的,PHP的插件都需要在[extension]中添加启用对应的模块,并且将对应的动态链接库 (*.dll)复制到ext目录中。我们往往注意到MySQL.dll这个库,却忽视了libmysql.dll这个文件。因为在早期版本PHP中,该文 件保存在PHP根目录的,所以很多人在制作新版本的文件包的时候搞错了,把这个本应该移动到ext中的文件忘记了。才导致了这个错误!

[转载]无法载入MYSQL扩展,请检查PHP配置

mikel阅读(890)

来源: [转载]无法载入MYSQL扩展,请检查PHP配置

此类问题特别针对PHPMYADMIN对PHP更新之后 MYSQL插件无法应用而导致的不能使用问题,一般来说PHP跟MYSQL等 有一系列的整合包 但是如果出现该问题 可以参照下面的解决方法
phpMyAdmin“无法载入mysql扩展,请检查PHP配置”的解决方法

在配置了PHP的运行环境,并且安装了MySQl数据库之后,下面就可以学习下PHP如何与MySQL进行交互了。

既然MySQL是数据库,则必不可少的需要建立数据库、表、字段等操作(假象下我们使用ASP+ACCESS的情形),然而对于MySQL数据 库而言,在我们默认安装时是没有可视化界面操作MySQl的,所以我们很多时候是借助phpMyAdmin来操作MySQL数据库的。

然而通过“PHP 5.2.3 installer”安装版的使用,当我们应用到phpMyAdmin,页面出现了“无法载入mysql扩展,请检查PHP配置”的提示。

1,首先,我们就来检查PHP配置文件 php.ini

打开PHP所安装目录下的 php.ini 文件,Ctrl+F搜索“php_mysql.dll”,将“;extension=php_mysql.dll”前的“;”删除以取消注释,同时搜索并 修改“extension_dir”的值为“php_mysql.dll”文件所在文件夹。即:

extension_dir = “D:PHP\ext”

extension=php_mysql.dll

2,然而通过这一页所使用的安装版是没有保存PHP扩展DLL文件的ext文件夹的,所以也就没有php_mysql.dll,我们运行phpMyAdmin当然会有问题

继续打开http://www.php.net/downloads.php 选择“PHP 5.2.3 zip package”压缩包文件,将其中的ext文件夹全部解压到PHP的安装目录下,所以才有了extension_dir = “D:PHPext”(注:前提是你的PHP安装在D盘)

3,完成了对php.ini文件的修改和包含有php_mysql.dll的ext文件夹的添加,建议重新启动下计算机,再来调试phpMyAdmin

4,当然,对于phpMyAdmin文件夹内的config.inc.php文件进行MySQL帐号和密码的修改。

另外,在网络上搜索了下本问题的相关解决方法,有的解决还需要把“php.ini文件和php_mysql.dll拷贝到了c:/windows 以及c:/windows/system32目录”内,这是由于PHP是非安装版,一般安装版则不需要了,你可以在“我的电脑”属性“高级”中选择“环境 变量”查看系统变量“Path”其中就指明了PHP的安装路径。

phpMyAdmin“无法载入mysql扩展,请检查PHP配置”的问题解决(感谢含笑的指导参考),下面可以学习使用PHP与MySQL交互操作了。