delphi windows操作、窗口、句柄、鼠标_delphi windowfrompoint-程序员宅基地

技术标签: 【Delphi系统相关】  windows  

输入


procedure TypeKeyString(s: string);
var
  c: Char;
  i: integer;
  off: integer;
  vkw: Word;
begin
  for i := 1 to Length(s) do
  begin
    c := s[i];
    if (c < #128) then
    begin
      vkw := VkKeyScan(c);
      off := 0;
      if vkw and $100 = $100 then
        keybd_event(VK_SHIFT, 0, off, 0);
      if vkw and $200 = $200 then
        keybd_event(VK_CONTROL, 0, off, 0);
      if vkw and $400 = $400 then
        keybd_event(VK_MENU, 0, off, 0);

      off := 0;
      keybd_event(Byte(vkw), 0, off, 0);
      //sleep(20);
      off := off or KEYEVENTF_KEYUP;
      keybd_event(Byte(vkw), 0, off, 0);

      off := off or KEYEVENTF_KEYUP;
      if vkw and $100 = $100 then
        keybd_event(VK_SHIFT, 0, off, 0);
      if vkw and $200 = $200 then
        keybd_event(VK_CONTROL, 0, off, 0);
      if vkw and $400 = $400 then
        keybd_event(VK_MENU, 0, off, 0);
    end;
  end;
end;

procedure SendKeys(focushld:hwnd;sSend:string);//发送中英文混合文本
var
    i,returnint:integer;
    ch: byte;
begin
  if focushld = 0 then Exit;
  i := 1;
  while i <= Length(sSend) do
  begin
    ch := byte(sSend[i]);
    if Windows.IsDBCSLeadByte(ch) then
    begin
      Inc(i);
      returnint:=SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend[i]), ch), 0);
    end
    else
      returnint:=SendMessage(focushld, WM_IME_CHAR, word(ch), 0);
    Inc(i);
  end;
if returnint=0 then
begin
TypeKeyString(sSend);
end;
  //postmessage(focushld,WM_keydown,13,0); //输入回车
end;

procedure Poststring(str:string)
var
a:TPoint; //用来存放坐标
hw:HWND; //用来存放窗口句柄
begin
sleep(1000);
GetCursorPos(a);  //取得鼠标坐标,并存放进a中
hw := WindowFromPoint(a); //取得变量a 对应的 窗口句柄
SendKeys(hw,str);
end;

View Code
windows版本信息


Function TFrmVersion.GetWinVersion:integer;
var
  version:TOSVersionInfo;
begin
//result 0 is Winxp
//result 1 is Windows NT
//result 2 is Windows 98
//result 3 is windows 2000
  result:=-1;
  Version.dwOSVersionInfoSize:=sizeof(TOSVersionInfo);
  Getversionex(version);
  case  Version.dwPlatformId  of
  VER_PLATFORM_WIN32_NT:
    begin
      if (version.dwMajorVersion=5) and (version.dwMinorVersion=1) then
      result:=0;
      if (version.dwMajorVersion=4) and (version.dwMinorVersion=0) then
      result:=1;
      if (version.dwMajorVersion=5) and (version.dwMinorVersion=0) then
      result:=3;
    end;
  VER_PLATFORM_WIN32_WINDOWS:
    begin
      result:=2;
    end;
  end;
end;

procedure TFrmVersion.BtnGetVersionClick(Sender: TObject);
begin
  RGPVersion.ItemIndex:=GetWinVersion;
end;

procedure TFrmVersion.BtnCloseClick(Sender: TObject);
begin
  Close;
end;

View Code
delphi中获取光标句柄代码


{
 当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。
 本文阐述如何在任何线程掌握光标时都能够获取光标句柄。
 例如,想在屏幕截取程序中放置光标时该如何做。
}

function GetCursorHandle: HCURSOR;
var
  hWindow: HWND;
  pt: TPoint;
  pIconInfo: TIconInfo;
  dwThreadID, dwCurrentThreadID: DWORD;
begin
  // 检查哪个窗体掌握光标
  GetCursorPos(pt);
  hWindow := WindowFromPoint(pt);

  // 获得光标所有者的线程ID
  dwThreadID := GetWindowThreadProcessId(hWindow, nil);

  // 获得当前线程的ID
  dwCurrentThreadID := GetCurrentThreadId;

  // 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。
  //然后调用GetCursor()来获得正确的光标句柄(hCursor)。

  if (dwCurrentThreadID <> dwThreadID) then
  begin
    if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
    begin
      // 获得光标句柄
      Result := GetCursor;
      AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
    end;
  end else
  begin
    Result := GetCursor;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CurPosX, CurPoxY: Integer;
  MyCursor: TIcon;
  pIconInfo: TIconInfo;
begin
  MyCursor := TIcon.Create;
  try
    MyCursor.Handle := GetCursorHandle;
    // 获得光标位置
    GetIconInfo(MyCursor.Handle, pIconInfo);
    CurPosX := pIconInfo.xHotspot;
    CurPoxY := pIconInfo.yHotspot;
    // 在窗体上画出光标
    Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
  finally

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。

=========================================================

{
 当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。
 本文阐述如何在任何线程掌握光标时都能够获取光标句柄。
 例如,想在屏幕截取程序中放置光标时该如何做。
}

function GetCursorHandle: HCURSOR;
var
  hWindow: HWND;
  pt: TPoint;
  pIconInfo: TIconInfo;
  dwThreadID, dwCurrentThreadID: DWORD;
begin
  // 检查哪个窗体掌握光标
  GetCursorPos(pt);
  hWindow := WindowFromPoint(pt);

  // 获得光标所有者的线程ID
  dwThreadID := GetWindowThreadProcessId(hWindow, nil);

  // 获得当前线程的ID
  dwCurrentThreadID := GetCurrentThreadId;

  // 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。
  //然后调用GetCursor()来获得正确的光标句柄(hCursor)。

  if (dwCurrentThreadID <> dwThreadID) then
  begin
    if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
    begin
      // 获得光标句柄
      Result := GetCursor;
      AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
    end;
  end else
  begin
    Result := GetCursor;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CurPosX, CurPoxY: Integer;
  MyCursor: TIcon;
  pIconInfo: TIconInfo;
begin
  MyCursor := TIcon.Create;
  try
    MyCursor.Handle := GetCursorHandle;
    // 获得光标位置
    GetIconInfo(MyCursor.Handle, pIconInfo);
    CurPosX := pIconInfo.xHotspot;
    CurPoxY := pIconInfo.yHotspot;
    // 在窗体上画出光标
    Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
  finally
    MyCursor.ReleaseHandle;
    MyCursor.Free;
  end;
end;

// 另外一种解决办法:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  CI: TCursorInfo;
begin
  CI.cbSize := SizeOf(CI);
  GetCursorInfo(CI);
  Image1.Picture.Icon.Handle := CI.hCursor;
end;
    MyCursor.ReleaseHandle;
    MyCursor.Free;
  end;
end;

// 另外一种解决办法:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  CI: TCursorInfo;
begin
  CI.cbSize := SizeOf(CI);
  GetCursorInfo(CI);
  Image1.Picture.Icon.Handle := CI.hCursor;
end;

View Code
向其他程序发送模拟按键


向其他程序发送模拟按键:

1、用keybd_event:

var
h : THandle;
begin
h := FindWindow('TFitForm', '1stOpt - [Untitled1]');
SetForegroundWindow(h);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(VK_F9, MapVirtualKey(VK_F9, 0), 0, 0);
keybd_event(VK_F9, MapVirtualKey(VK_F9, 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
end;

选找到目标程序的句柄h,在应用Keybd_event之前必须先把目标程序设为当前活动窗口。(如果不想看见的话,把目标程序的位置用SetWindowLong设置在屏幕之外.)

2、用SendMessage、PostMessage:不需目标置为最前。

SendMessage(h,WM_KEYDOWN,VK_F9,0);

PostMessage(h,WM_KEYDOWN,VK_F9,0);

发送组合键:PostMessage(h,WM_SYSKEYDOWN,VK_F9,$10000000);//试验不成功

Ctrl : $10000000; 
Shift: $08000000; 
Alt: $20000000

如打开菜单ALT-F,则要WM_SYSKEYDOWM,:PostMessage(h,WM_SYSKEYDOWN,70,$20000000);才行。(//试验成功)

3、CTL键组合发送不成功。

4、向后台应用程序发送按键总结:

4.1 单个按健:PostMessage(h,WM_KEYDOWN,VK_F9,0);

4.2ALT+按键:PostMessage(h,WM_SYSKEYDOWN,70,$20000000);

4.3CTL+按键:暂时模仿如下,基本可行。但不用sleep(10),有时行,有时不行。换用SendMessage却不行,WHY?

if hwnd<>0 then
begin
keybd_event(VK_CONTROL,0,0,0);
PostMessage(hwnd,WM_KEYDOWN,VK_F9,0);
PostMessage(hwnd,WM_KEYUP,VK_F9,0);
sleep(10);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
end;


说明:

键盘事件消息可以分为“击键”和“字符”两类。对于可以显示字符的击键组合,Windows不仅向程序发送击键消息,还发送字符消息。有些键不产生字符,这些键包括shift键、Fn功能键、光标移动键和特殊字符如Insert和Delete。

击键消息包括WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP四种类型。WM_KEYDOWN和WM_KEYUP消息通常是在按下或释放不带Alt键的键时产生;WM_SYSKEYDOWN和WM_SYSKEYUP消息通常由与Alt组合的击键产生,这些键激活程序菜单或系统菜单上的选项,或切换活动窗口,也可以用作系统菜单加速键。由于Windows处理所有Alt键的功能,应用程序无需捕获这些消息。对于4类击键消息,wParam是虚拟键代码,代表按下或释放的键,而lParam包含击键的其他数据。如果按住一个键不放使得自动重复功能生效,那么该键最后被释放时,Windows会给窗口过程发送一系列的WM_KEYDOWN(或WM_SYSKEYDWON)消息和一个WM_KEYUP(或WM_SYSKEYUP)消息。

View Code
delphi 获取文件版本


function GetFileVersion(FileName: string): string;
const
InfoNum = 9;
InfoStr: array[1..InfoNum] of string = (
'ProductName',
'ProductVersion',
'FileDescription',
'LegalCopyright',
'FileVersion',
'CompanyName',
'LegalTradeMarks',
'InternalName',
'OriginalFileName'
);
var
S: string;
BufSize, Len: DWORD;
Buf: PChar;
Value: PChar;
begin
  S := FileName;
  BufSize := GetFileVersionInfoSize(PChar(S), BufSize);
  if BufSize > 0 then begin
      Buf := AllocMem(BufSize);
      GetFileVersionInfo(PChar(S), 0, BufSize, Buf);
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[1]), Pointer(Value), Len) then
//        result := Value;
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[2]), Pointer(Value), Len) then
//        result := Value; //产品版本:
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[3]), Pointer(Value), Len) then
//        result := Value;//'文件说明: '
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[4]), Pointer(Value), Len) then
//        result :=  Value; //'合法版权: ' +
      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[5]), Pointer(Value), Len) then
        result :=  Value; //'文件版本: ' +
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[6]), Pointer(Value), Len) then
//        result :=  Value; //'公司名称: ' +
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[7]), Pointer(Value), Len) then
//        result :=  Value;// '合法商标: ' +
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[8]), Pointer(Value), Len) then
//        result :=  Value;// '内部名称: ' +
//      if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\' + InfoStr[9]), Pointer(Value), Len) then
//        result :=  Value; //'原文件名: ' +
      FreeMem(Buf, BufSize);
  end
  else begin
//     Application.MessageBox('获取产品信息时遇到致命错误,请尝试重新启动软件。'+ #13 + '若仍未能解决问题,请联系产品服务人员。','错误',MB_OK + MB_ICONSTOP);
    result := '0.0.0.0';
  end;
end;

View Code
Delphi中限制鼠标的移动区域


下面把鼠标的移动区域限制在(100,100,200,200)

var
rect:TRect;
begin
rect.Left:=100;
rect.Top:=100;
rect.Bottom:=200;
rect.Right:=200;
windows.ClipCursor(@rect);
end;

恢复鼠标的移动区域
windows.ClipCursor(0);

var 
P: tpoint; 
h: thandle; 

getCursorpos(p); //鼠标点击位置
h:= windowFromPoint(p); 

if h= wincontrol.handle then 
  showmessage('在某一控键上');

procedure TForm2.Timer1Timer(Sender: TObject);
var
p: TPoint;
h: HWND;
r:trect;
begin
GetCursorPos(p);
h := WindowFromPoint(p);
GetWindowRect(h,r);//得到窗口的左上角坐标
label4.Caption:=format('x: %d, y: %d',[r.left,r.top]);
Windows.ScreenToClient(h, p);
label1.Caption:=format('x: %d, y: %d',[p.X,p.y]);//鼠标在窗口里的相对位置坐标

end;

View Code
Delphi模拟按键精灵操作网页


一、让Webbrowser响应回车事件!

在窗体中放入一个ApplicationEvents1,然后定义事件:

private
    procedure  ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean); //响应回车事件(Alt+Enter)

//程序实现:只需改动webForm.wb1.Handle即可

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);

{fixesthemalfunctionofsomekeyswithinwebbrowsercontrol}
   const
    StdKeys=[VK_TAB,VK_RETURN];{standardkeys}
    ExtKeys=[VK_DELETE,VK_BACK,VK_LEFT,VK_RIGHT];{extendedkeys}
    fExtended=$01000000;{extendedkeyflag}
begin
  Handled   :=   False;
  with   Msg   do
  if ((Message>= WM_KEYFIRST) and (Message<=WM_KEYLAST))  and
     ( (wParam   in   StdKeys) or {$IFDEF   VER120}(GetKeyState(VK_CONTROL)<0 ) or {$ENDIF}
     (wParam   in   ExtKeys) and ( (lParam   and   fExtended)= fExtended) )
  then
  try
    if   IsChild(webForm.wb1.Handle,   hWnd)   then
    {   handles   all   browser   related   messages   }
    begin
      with  webForm.wb1.Application   as   IOleInPlaceActiveObject   do
          Handled   :=   TranslateAccelerator(Msg)   =   S_OK;
      if   not   Handled   then
      begin
        Handled   :=   True;
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end;
  except

  end;

end;

二、delphi模拟按键精灵鼠标、键盘操作

procedure TForm1.wjLoginClick(Sender: TObject);

var

  login_user : string;

  login_password : string;

  oldPt,newPt : TPoint;

begin

//  webForm.Show;

  //获取当前光标位置,并赋值给oldPt

  GetCursorPos(OldPt);

  //设置新光标位置

  NewPt:=Point(wb1.Left+1,wb1.Top+1);

  //是把坐标从当前窗体转化成全屏幕的!!!

  Windows.ClientToScreen(wb1.Handle, NewPt);

  //设置鼠标指针位置并点击

  SetCursorPos(NewPt.X, NewPt.Y);

  mouse_event(MOUSEEVENTF_LEFTDOWN, NewPt.X, NewPt.Y, 0, 0);

  mouse_event(MOUSEEVENTF_LEFTUP, NewPt.X, NewPt.Y, 0, 0); 

  //还原鼠标位置

  SetCursorPos(oldPt.X, oldPt.Y);

  //模拟按下TAB键

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0);

  //再次模拟按下TAB键

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0);

  //再次模拟按下TAB键

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0); 

//------------------------开始密码输入------------------------------

  Clipboard.Clear;

  //将用户名存入剪切板

  login_user := Trim(edt1.text);

  Clipboard.SetTextBuf(PChar(login_user));

  //模拟按下ctrl+v        

//  ShowMessage(Clipboard.AsText);

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0);

  keybd_event(86,0,0,0);

  keybd_event(86,0,KEYEVENTF_KEYUP,0);

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);

//------------------------开始密码输入------------------------------

  delay(500);

  Clipboard.Clear;

  //模拟按下TAB键

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0);

  //再次模拟按下TAB键

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0);

  login_password := Trim(edt2.text);

  Clipboard.AsText := login_password;

  //模拟按下ctrl+v

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0);

  keybd_event(86,0,0,0);

  keybd_event(86,0,KEYEVENTF_KEYUP,0);

  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);

//------------------------开始按下登录按钮------------------------------

  delay(500);

  //模拟按下TAB键

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),0,0);

  keybd_event(VK_TAB,MapVirtualKey(VK_TAB,0),KEYEVENTF_KEYUP,0);

  //模拟按下回车键不管用,只能用空格键

  keybd_event(VK_SPACE,MapVirtualKey(VK_SPACE,0),0,0);

  keybd_event(VK_SPACE,MapVirtualKey(VK_SPACE,0),KEYEVENTF_KEYUP,0);

end;

三、在指定位置单击保存验证码图片

function TForm1.getcheckcode :string;

var

  oldPt : Tpoint;

  NewPt : TPoint;

  i,N   : Integer;

  myhkl : hkl;

  h     : HWND;

  r     : TRect;

  yzmPath : String;

begin

  //获取当前光标位置,并赋值给oldPt

  GetCursorPos(OldPt);

  //设置新光标位置

  NewPt:=Point(540,445);

  //是把坐标从当前窗体转化成全屏幕的!!!

  Windows.ClientToScreen(wb1.Handle, NewPt);

  //设置鼠标指针位置并右击

  SetCursorPos(NewPt.X, NewPt.Y);

  mouse_event(MOUSEEVENTF_RIGHTDOWN, NewPt.X, NewPt.Y, 0, 0);

  mouse_event(MOUSEEVENTF_RIGHTUP, NewPt.X, NewPt.Y, 0, 0);

  yzmPath := GetShellFolder('Personal')+'My Pictures\无标题.bmp';

  if FileExists(yzmPath) then

    DeleteFile(yzmPath);

  SetCursorPos(NewPt.X+85, NewPt.Y+105);   //鼠标移动到“图像另存为(s)...”

  //单击ENTER键,保存图片

  keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),0,0);

  keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),KEYEVENTF_KEYUP,0);

  //单击ENTER键,关闭保存图片窗口

  keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),0,0);

  keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),KEYEVENTF_KEYUP,0);

  //监听窗口是否关闭掉

  timer_Listen_PopuForm.Enabled := True;

  delay(500);

  kGetCodeFromFile(PChar(yzmPath), '', '1', 'dv', pCode, Length(code), '');

  Result := code;

//  if ImmIsIME(myhkl) then     //判断是否在中文状态,若是则关闭它

//    immsimulateHotkey(handle,IME_CHotKey_IME_NonIME_Toggle);

  SetCursorPos(oldPt.x,oldPt.Y);

end;
View Code
Delphi 全局鼠标钩子的简单演程序


dll源代码:
---------------------------------------------------------------------------

library Project2;

uses
  SysUtils,
  Classes,
  Windows,Messages;


{$R *.res}
var
  hHook1:HHOOK;

function hookProc(
  nCode:Integer;      // hook code
  wParam:WPARAM;  // message identifier消息标识
  lParam:LPARAM   // mouse coordinates鼠标坐标
):LRESULT;stdcall;
begin
  if wParam=WM_LBUTTONDOWN then //只处理鼠标的左键按下消息
  begin
    MessageBeep(0);
  end;
  Result:=CallNextHookEx(hHook1,nCode,wParam,lParam);

end;

//设置鼠标钩子
function setHook:Boolean;stdcall;
begin

  hHook1:=SetWindowsHookEx(WH_MOUSE,@hookProc,HInstance,0);
  Result:=hHook1<>0;
end;

//删除鼠标钩子
function delHook:Boolean;stdcall;
begin
  Result:=UnhookWindowsHookEx(hHook1);
end;

exports        //导出函数
  setHook name 'setHook',
  delHook name 'delHook',
  hookProc name 'hookProc';

begin

end.

调用源代码:
---------------------------------------------------------------------------

 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  Private
    { Private declarations }
  public
    constructor Create(AOwner: TComponent); override;

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function setHook:Boolean;external 'project2.dll' name 'setHook';
function delHook:Boolean;external 'project2.dll' name 'delHook';

procedure TForm1.Button1Click(Sender: TObject);
begin
  if sethook then
    Label1.Caption:='钩子安装成功,按鼠标左键会发出声音';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if delHook then
    Label1.Caption:='勾子已经删除';
end;

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  form1.Label1.Caption:='';
end;

end.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ampeter/article/details/121490420

智能推荐

2016MUTC9-1010 Jong Hyok and String_hdu 5853 jong hyok and string-程序员宅基地

文章浏览阅读581次。题解:将p串翻转,间隔不同字符连接起来,进行一次后缀数组的操作。若strange set(Q)>0,那么Q肯定是p串中一个的子串。所以Q串翻转后,二分直接在后缀数组中找到边界位置,lower和upper。当不存在时,答案为0;当lower==upper时,答案为最大长度(sa[lower]到间隔字符的长度)-最小长度(max(height[lower],height[upper+1])+1_hdu 5853 jong hyok and string

已解决UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0x8e in position 0: ordinal not in range(128)_unicodedecodeerror: 'ascii' codec can't decode byt-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏9次。已解决(Python编码问题)UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x8e in position 0: ordinal not in range(128)_unicodedecodeerror: 'ascii' codec can't decode byte 0xe8 in position 0: ordi

决策树学习-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏10次。决策树学习是应用最广的归纳推理算法之一,它是一种逼近离散值函数的方法。在这种方法中学习到的函数被表示为一颗决策树,学习得到的决策树也能再被表示为多个if-then规则,以提高可读性。决策树学习方法对噪声数据有很好的健壮性且能够学习析取表达式。决策树学习算法有很多,比如ID3、C4.5、ASSISTANT等等。这些决策树学习方法搜索一个完整表示的假设空间,从而避免了受限假设空间的不足。决策树学习的归纳偏置是优先选择较小的树。决策树表示法决策树通过把实例从根节点排列(sort)到某个叶子节点来分类实_决策树学习

Vue 项目导入字体文件_vue 引入字体-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏4次。要想实现UI设计师设计的原型效果,有时候需要用到一些特殊的字体,在项目中就需要导入相关的字体文件。本文章以平方字体为例。_vue 引入字体

Unity导出微信小游戏_unity导出微信小游戏项目流程-程序员宅基地

文章浏览阅读762次。Unity自带的方法基本都支持 , 验证了一下BestHTTP插件没法使用 , 场景切换会崩溃 暂时没找到问题出在哪。先验证流程 , 创建一个空项目 , 把微信提供的插件导入进空项目。直接点顶上的导出微信小游戏 , 填入必备的信息(appid…到这里 虽然没有具体验证完成所有的东西 , 但是。微信小游戏感觉这几年挺火,打算熟悉一下流程看看。微信提供的Unity转微信小游戏解决方案。后续接着验证经常用的插件 看看是否支持。2023年03月06日14:48:28。编译平台选WebGL。_unity导出微信小游戏项目流程

匈牙利算法:二分图最大匹配_二分图最大匹配om√n-程序员宅基地

文章浏览阅读65次。#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 510, M = 100010;int n1, n2, m;int h[N], e[M], ne[M], idx;int match[N];bool st[N];void add(int a, int b){ e[idx] = b, ne[idx] = h[_二分图最大匹配om√n

随便推点

基于 SpringBoot + MyBatis 的在线音乐播放器_springboot播放mp3-程序员宅基地

文章浏览阅读1k次。value="删除音乐" οnclick="deleteMusic(\''+list.musicId+'\')">';return new ResponseBodyMessage(-1,"没有你要删除的音乐",false);_springboot播放mp3

Flex调用GP服务实现按划选范围切割地图(二)_flex drawevent.draw_end-程序员宅基地

文章浏览阅读1.7k次。具体代码实现:http://ns.adobe.com/mxml/2009” xmlns:s=”library://ns.adobe.com/flex/spark” xmlns:esri=”http://www.esri.com/2008/ags“ xmlns:mx=”library://ns.adobe.com/flex/mx”minWidt_flex drawevent.draw_end

css图标与文字对齐实现方法-程序员宅基地

文章浏览阅读101次。1.移动端(安卓设备、ios设备)图标文字垂直居中对齐的最佳常用解决方案是采用弹性盒子布局,可以快捷有效实现子元素未知高度绝对垂直居中对齐。PC端考虑到兼容性的问题,一般不推荐使用弹性盒子,依旧只能采用传统方式(vertical-align: middle;或者position定位)实现图标文字对齐。2.实际上不管是line-height还是用position去定位,不管你display用..._css实现,左侧两行文字,右侧图标始终跟第一行文字对齐

springboot activiti关闭验证自动部署_activiti工作流引擎关闭-程序员宅基地

文章浏览阅读932次。# spring-activiti# 自动部署验证设置:true-开启(默认)、false-关闭spring.activiti.check-process-definitions=false# asyncExecutorEnabled属性设置设置true后将代替那些老的Job executorspring.activiti.async-executor-enabled=falsesp..._activiti工作流引擎关闭

调用JAVABEAN连接类_连接javabean-程序员宅基地

文章浏览阅读94次。调用JAVABEAN连接类_连接javabean

CLR 4.0 拾遗系列1.1 System.AccessViolationException-程序员宅基地

文章浏览阅读167次。Namespace: System Class: System.AccessViolationException Remarks: An access violation occurs in unmanaged or unsafe code when the code attempts to read or write to memory that has not ..._stgm_readwrit

推荐文章

热门文章

相关标签