我有一個表單Form1和一個表單Form2,Form1程式監聽Form2里面的edit(有兩個edit,edit1和edit2),當焦點從edit1移動到edit2或者從edit2移動到edit1,那么showmessage焦點離開前的文本框內容,代碼在Form1中,Form2僅僅只有控制元件,請問如何實作
uj5u.com熱心網友回復:
Form2中如果觸發了失去焦點事件,就向Form1發送個訊息,然后Form1收到該訊息后處理就行了。uj5u.com熱心網友回復:
感覺是想搞一個外掛uj5u.com熱心網友回復:
請問有代碼嗎,能否給我參考一下 我只需要接收到指定edit句柄的失去焦點事件 之前想用findcontrol方法去強制轉換成為Tedit 結果發現回傳為NIL 網上答案說兩個不同行程記憶體控制元件不同 所以沒法直接轉換
uj5u.com熱心網友回復:
請問你有做過嗎,我這個是我公司的軟體,沒有原始碼只有安裝包。 所以才做外掛程式
uj5u.com熱心網友回復:
這類軟體沒做過uj5u.com熱心網友回復:
上次沒仔細看,原來你是兩個不同的程式。說下我的思路:你看下Edit有沒有視窗,如果有視窗,就往目標程式中注入個動態庫,然后動態庫里設定一個鉤子函式來截獲目標視窗的訊息。如果發現是WM_KILL_FOCUS訊息,就說明目標視窗失去了焦點,然后你再發個訊息通知你的程式。具體代碼你網上搜搜,應該很多的。uj5u.com熱心網友回復:
我做了鍵盤監控的鉤子 因為快捷鍵是F12提交 我能截取鍵盤的 至于外部程式的edit失去焦點 我的確看了很多不行 都是關于鍵盤或者是發送訊息給Form2 很少有判斷失去焦點的 再一個我已經獲取了那個edit的句柄,你看看能不能抽出一點點你寶貴的時間 幫我分析一下 專案有點趕 謝謝
uj5u.com熱心網友回復:
我也是好多年不做這個了,細節上說的未必準。但是今天我用spy++看了下,vcl的Edit失去焦點的時候,Edit視窗會收到WM_KILL_FOCUS訊息,所以問題的關鍵在于你鉤子函式里面能否捕捉到這個訊息,如果能,再判斷這個訊息對應的視窗是不是Edit的,如果是那就說明Edit失去焦點了。如果此路不通,還有個辦法是注入目標行程后,把Edit的視窗程序改成你自己寫的一個視窗程序,你自己的視窗程序再調原來的視窗程序,這樣所有經過Edit的訊息你都能收到,剩的無非是判斷下是不是失去焦點的訊息即可。uj5u.com熱心網友回復:
大哥你說的我大概能理解一大半意思,是否能推薦一個文章給我,我自己找的東西不清楚那個是做你說的這個。
uj5u.com熱心網友回復:
你搜控制元件子類化,應該有不少代碼可以參考。就是我說的第二種方法。uj5u.com熱心網友回復:
最簡單的方法,通過滑鼠坐標解決第一步:拿到FORM2視窗句柄坐標
第二步:取得FORM2 edit1 edit 2 表單內坐標
第三步: 直接判斷兩者ED1,和ED2的坐標是否相等就解決了
uj5u.com熱心網友回復:
不是這個意思,比如我edit1正在輸入內容 我想判斷什么時候輸入完成 所以用失去焦點來判斷
uj5u.com熱心網友回復:
額 注入 hook記憶體地址 跳轉至自身showmessage 運行hook地址代碼(5位元組以上)跳轉回原代碼。關鍵的問題就是od反匯編找到edt失去焦點的關鍵call的記憶體地址。
uj5u.com熱心網友回復:
可以通過滑鼠的位置,獲取指定控制元件的句柄。這樣,就可獲得控制元件的事件了。uj5u.com熱心網友回復:
這種跨行程的問題,我覺得應該要用windows的鉤子函式來解決,或許有更好的解決方法。
library MyHook;
uses
SysUtils,
Windows,
Messages,
Classes;
{$R *.res}
var
hook:HHook=0;
function MyWndProc(ACode:Integer;AWParam:LongInt;ALParam:LongInt):LResult;stdcall;
var
Log:TextFile;
sFN:string;
sTxt:array[0..255] of char;
msg:PCWPStruct;
begin
if (ACode<0) then
begin
result:=CallNextHookEx(hook,ACode,AWParam,ALParam);
exit;
end;
if (ACode<>HC_ACTION) then
begin
result:=CallNextHookEx(hook,ACode,AWParam,ALParam);
exit;
end;
msg:=PCWPStruct(ALParam);
if msg.message = WM_SETFOCUS then
begin
sFN:='c:\HookRS.txt';
AssignFile(Log,sFN);
try
if not FileExists(sFN) then
ReWrite(Log)
else Append(Log);
GetWindowText(msg.wParam,sTxt,256);
WriteLn(Log,'失去焦點視窗內容:'+sTxt);
GetWindowText(msg.hwnd,sTxt,256);
WriteLn(Log,'獲得焦點視窗內容:'+sTxt);
finally
CloseFile(Log);
end;
end;
result:=CallNextHookEx(hook,ACode,AWParam,ALParam);
end;
function SetHook:Boolean;stdcall;
begin
result:=False;
if hook>0 then exit;
hook:=SetWindowsHookEx(WH_CALLWNDPROC,@MyWndProc,hInstance,0);
result:=hook<>0;
end;
function DelHook:Boolean;stdcall;
begin
result:=UnHookWindowsHookEx(hook);
end;
exports
SetHook,
DelHook;
begin
end.
呼叫:
......
implementation
{$R *.dfm}
function SetHook:Boolean; external 'MyHook.dll';
function DelHook:Boolean; external 'MyHook.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
SetHook;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DelHook;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := '安裝鉤子';
Button2.Caption := '載卸鉤子';
FormStyle := fsStayOnTop; {為了測驗, 讓視窗一直在前面}
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DelHook;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/35983.html
標籤:語言基礎/算法/系統設計
上一篇:筆記1
