需解決問題:Dll HOOK(WH_KEYBOARD)。調用Synchronize同步線程。首先我可以確定EXE和DLL都是沒錯的。我也專門新建了個工程(應用程序)測試。代碼沒問題。下面是我的代碼:{ ************************* Dll Form ************************* }
var
Form1: TForm1;
Temp: TempThread;procedure TForm1.Button1Click(Sender: TObject);
begin
Temp.Resume;
end;{ ************************* Dll Thread ************************* }
type
TempThread = class(TThread)
private
sName: String;
procedure PushName;
protected
procedure Execute; override;
end;procedure TempThread.PushName;
begin
sName := Form1.Edit1.Text;
Form1.Caption := sName;
end;procedure TempThread.Execute;
begin
Synchronize(PushName);
end;{ ************************* Dll HOOK ************************* }
var
iHOOK: HHOOK = 0;
procSaveExit: Pointer;function MyProc(eCode: Integer; wParam: wParam; lParam: lParam): lResult;
begin
Result := 0;
if eCode < 0 then
begin
Result := CallNextHookEx(iHOOK, eCode, wParam, lParam);
Exit;
end;
if ((lParam and $80000000) = 0) and (wParam = VK_F12) then
begin
Result := 1;
if not Assigned(Form1) then
begin
Form1 := TForm1.Create(Application);
Temp := TempThread.Create(True);
end
else
Form1.Visible := not Form1.Visible;
end;
end;procedure BeginHK;
begin
if iHOOK <> 0 then Exit;
iHOOK := SetWindowsHookEx(WH_KEYBOARD, @MyProc, hInstance, 0);
end;function EndHK: Boolean; StdCall; Export;
begin
if iHOOK <> 0 then
begin
UnhookWindowsHookEx(iHOOK);
iHOOK := 0;
end;
Result := iHOOK = 0;
end;{ ************************* Exe Form ************************* }
var
Form1: TForm1;
procedure BeginHK; external 'dll.dll';
function EndHK: Boolean; external 'dll.dll';implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
BeginHK;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
EndHK;
end;再說一次。單EXE測試是沒問題的。我想問的是為什麽HOOK就不行了。
var
Form1: TForm1;
Temp: TempThread;procedure TForm1.Button1Click(Sender: TObject);
begin
Temp.Resume;
end;{ ************************* Dll Thread ************************* }
type
TempThread = class(TThread)
private
sName: String;
procedure PushName;
protected
procedure Execute; override;
end;procedure TempThread.PushName;
begin
sName := Form1.Edit1.Text;
Form1.Caption := sName;
end;procedure TempThread.Execute;
begin
Synchronize(PushName);
end;{ ************************* Dll HOOK ************************* }
var
iHOOK: HHOOK = 0;
procSaveExit: Pointer;function MyProc(eCode: Integer; wParam: wParam; lParam: lParam): lResult;
begin
Result := 0;
if eCode < 0 then
begin
Result := CallNextHookEx(iHOOK, eCode, wParam, lParam);
Exit;
end;
if ((lParam and $80000000) = 0) and (wParam = VK_F12) then
begin
Result := 1;
if not Assigned(Form1) then
begin
Form1 := TForm1.Create(Application);
Temp := TempThread.Create(True);
end
else
Form1.Visible := not Form1.Visible;
end;
end;procedure BeginHK;
begin
if iHOOK <> 0 then Exit;
iHOOK := SetWindowsHookEx(WH_KEYBOARD, @MyProc, hInstance, 0);
end;function EndHK: Boolean; StdCall; Export;
begin
if iHOOK <> 0 then
begin
UnhookWindowsHookEx(iHOOK);
iHOOK := 0;
end;
Result := iHOOK = 0;
end;{ ************************* Exe Form ************************* }
var
Form1: TForm1;
procedure BeginHK; external 'dll.dll';
function EndHK: Boolean; external 'dll.dll';implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
BeginHK;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
EndHK;
end;再說一次。單EXE測試是沒問題的。我想問的是為什麽HOOK就不行了。
procedure SetMainThreadID(const ThrdID:Cardinal);stdcall;
begin
MainThreadID:=ThrdID;
end;主程序在调用BeginHook前,调用此函数:SetMainThread(MainThreadID);试试看吧。建议你看看TThread的源码,看看同步是怎么做的。