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.