2007年9月1日
#
摘要: 重构前的代码,使用字符串处理状态
package org.zsk.refact;
public class SystemPermission {
private String state;
private boolean&...
阅读全文
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TEvent = procedure () of object;
TProc = procedure();
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
showmessage('方法指针的长度是:'+Inttostr(SizeOf(TEvent)));
showmessage('函数指针的长度是:'+Inttostr(SizeOf(TProc)));
end;
//函数指针是指向函数的32位指针,占4个字节。
//过程的指针结构如下
// PProc = ^TProc;//过程指针
// TProc = record
// Code: Pointer;//指向过程的代码
// end;
//方法指针是指向一个结构。方法的指针结构如下
// PMethod = ^TMethod;//方法指针
// TMethod = record
// Code: Pointer;//指向方法的代码
// Data: Pointer;//指向对象的数据
// end;
end.
SetForegroundWindow(HApp);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
keybd_event(ORD('B'), MapVirtualKey(Byte('t'), 0), 0, 0);
keybd_event(Byte('B'), MapVirtualKey(Byte('t'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
//Ctrl: VK_CONTROL
//SHIFT:VK_SHIFT
//TAB: VK_TAB
//ALT: VK_MENU
//'A': byte('A')
功能说明,
通过目标程序的句柄将该程序激活;
模拟鼠标按下
模拟鼠标抬起
PostMessage 只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行 ;
而 SendMessage 必须等待其他程序处理消息后才返回,继续执行。
PostMessage 的返回值表示 PostMessage 函数执行是否正确 ;
而 SendMessage 的返回值表示其他程序处理消息后的返回值。
使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否 ,PostMessage 会造成消息的滞后性 , 而 SendMessage 则不会 , 但如果 SendMessage 消息处理失败 , 则会造成程序停止 !
为了让大家能清楚的看到他们的效果,可以用下面的代码进行测试:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
mmo1: TMemo;
btn2: TButton;
btn3: TButton;
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
{ Private declarations }
procedure testPostMessage;
procedure testSendMessage;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses uFile;
{$R *.dfm}
var
f: TFile;
procedure TForm1.btn2Click(Sender: TObject);
var
i: Integer;
begin
testPostMessage;
for i := 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i)+'======');
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
i: Integer;
begin
testSendMessage;
for i := 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i)+'======');
end;
end;
procedure TForm1.testPostMessage;
var
i: Integer;
begin
PostMessage(f.Handle, WM_TEST, 0, 0);
for i := 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i))
end;
end;
procedure TForm1.testSendMessage;
var
i: Integer;
begin
SendMessage(f.Handle, WM_TEST, 0, 0);
for i := 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i))
end;
end;
initialization
if f = nil then
f := TFile.Create;
finalization
if f <> nil then
FreeAndNil(f);;
end.
unit uFile;
interface
uses
Classes, Windows, Forms, Messages;
const
WM_TEST = WM_USER + 1;
type
TFile = class
private
FHandle: HWND;
protected
procedure WndProc(var Msg: TMessage);
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
property Handle: HWND read FHandle;
end;
implementation
{ TFile }
procedure TFile.AfterConstruction;
begin
inherited;
FHandle := AllocateHWnd(WndProc);
end;
procedure TFile.BeforeDestruction;
begin
inherited;
DeallocateHWnd(FHandle);
end;
procedure TFile.WndProc(var Msg: TMessage);
begin
if msg.Msg = WM_TEST then
begin
//消息处理内容
Application.MessageBox('WM_TEST', 'WM_TEST', 0);
end;
windows.DefWindowProc(FHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
end.
直接在VC6下就能编译,记得不能Build All,只要在FileView选项卡下分别Build vncviewer files和winvnc files就可以。
特别感谢老张给的源码和帮助编译。
常用设置
1、显示行号 Window->Preferences->General->Editors->Text Editor 选择Show line numbers
2、设置UTF-8 Window->Preferences->General->Workspace 中Text file encoding 选择other并选UTF-8
快捷键
1、运行程序 Alt+Shift+X 按J run as javaApplication (按下Alt+Shift+X 后Eclipase右下角有提示)
2、排版 选中多行文本
Tab 后缩
Shift + Tab 前进
实现思路分析:
1、找到目标程序的句柄,可以通过窗口的caption属性获取,使用
FindWindow(nil, 'app caption');
2、找到你要控制的组件,如Button,使用
FindWindowEx(ParentHandle, 0, nil, 'btn caption');
3、发送Windows消息控制目标程序
SendMessage( HEdt, BM_CLICK, 0, 0 );
下面是实现该功能的Delphi代码:
unit Unit1;
Interface usesinterface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = Class (class(TForm)
btn1: TButton;
mmo1: TMemo;
edt1: TEdit;
edt2: TEdit;
btn3: TButton;
lbl1: TLabel;
lbl2: TLabel;
btn4: TButton;
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
ShellAPI;
{$R *.dfm}
var
HApp,
HEdt : THandle;
procedure TForm1.btn1Click(Sender: TObject);
begin
HApp := FindWindow(nil, PAnsiChar(edt1.text));
mmo1.Lines.Add(IntToStr(HApp));
HEdt := FindWindowEx(HApp, 0, nil, PAnsiChar(edt2.text));
mmo1.Lines.Add(IntToStr(HEdt));
SendMessage( HEdt, BM_CLICK, 0, 0 );
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
ShellExecute(handle, 'open', 'otherapp.exe',nil,nil, SW_SHOWNORMAL{SW_SHOWMAXIMIZED});
end;
procedure TForm1.btn4Click(Sender: TObject);
begin
SendMessage( HApp, WM_CLOSE, 0, 0 );
end;
end.