已知进程名,怎样获取它的主窗体句柄,并向主窗体发送虚拟键消息

解决方案 »

  1.   

    var
      TheWindow : HWND;
    begin
      TheWindow := FindWindow(nil, '计算器');
      if TheWindow <> 0 then
        PostMessage(TheWindow,WM_CLOSE,0,0);
    end;
    procedure EndProcess(AExeName: string);
    var
      lppe: TProcessEntry32;
      found : boolean;
      Hand : THandle;
    begin
      Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
      found := Process32First(Hand,lppe);
      while found do
      begin
        if UpperCase(StrPas(lppe.szExeFile)) = UpperCase(AExeName) then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE, true,
            lppe.th32ProcessID), 0);
          Exit;
        end
        else
          found := Process32Next(Hand,lppe);
      end;
    end;const
    PROCESS_TERMINATE = $0001;
    var
      ProcessHandle : THandle;
      ProcessID: Integer;
      TheWindow : HWND;
    begin
      TheWindow := FindWindow(nil, '计算器');
      GetWindowThreadProcessID(TheWindow, @ProcessID);
      ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
      TerminateProcess(ProcessHandle,4);
    end;
      

  2.   

    虚拟键: PostMessage(TheWindow,WM_CHAR,x,0);  等类似参考一下。
     case  x
       keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
    发送一个标示:
    postmessage(Edit1.Handle,WM_KEYDOWN,65,0);
    这是一个API函数。
    Edit1.Handle 是句柄;
    WM_KEYDOWN 是按下键的消息;
    65 是指键'a'的值 65……90 是 a……z;
    回车键是 VK_RETURN
     
    来自:fu_xiang_yu, 时间:2001-6-1 17:50:00, ID:550400
    (转)◇[DELPHI]发送虚拟键值ctrl V
    procedure sendpaste;
    begin
    keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
    keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);
    keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);
    keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
    end;◇[DELPHI]按键接受消息
    OnCreate事件中处理:Application.OnMessage:=MyOnMessage;
    procedure TForm1.MyOnMessage(var MSG:TMSG;var Handle:Boolean);
    begin
    if msg.message=256 then ... //ANY键
    if msg.message=112 then ... //F1
    if msg.message=113 then ... //F2
    end;◇[DELPHI]关于键盘常量名
    VK_BACK/VK_TAB/VK_RETURN/VK_SHIFT/VK_CONTROL/VK_MENU/VK_PAUSE/VK_ESCAPE
    /VK_SPACE/VK_LEFT/VK_RIGHT/VK_UP/VK_DOWN
    F1--F12:$70(112)--$7B(123)
    A-Z:$41(65)--$5A(90)
    0-9:$30(48)--$39(57)
    RegisterHotKey(Handle,11,0,192); // ~键的虚拟码
     这一节中,只简单地把键盘的主要虚拟键码列出来,如果需要更详细的信息,则在msdn上的Platform SDK/User Interface Services/User Input/VirtualKey Codes可以看到完整的键码列表。 
     首先列出,然后再做解释:
    --------------------------------------------------------------------------------十进制值 标识符 IBM兼容键盘 --------------------------------------------------------------------------------1    VK_LBUTTON   鼠标左键 
    2    VK_RBUTTON   鼠标右键 
    3    VK_CANCEL   Ctrl+Break(通常不需要处理) 
    4    VK_MBUTTON   鼠标中键 
    8    VK_BACK    Backspace 
    9    VK_TAB     Tab 
    12   VK_CLEAR    Num Lock关闭时的数字键盘5 
    13   VK_RETURN   Enter(或者另一个) 
    16   VK_SHIFT    Shift(或者另一个) 
    17   VK_CONTROL   Ctrl(或者另一个) 
    18   VK_MENU    Alt(或者另一个) 
    19   VK_PAUSE    Pause 
    20   VK_CAPITAL   Caps Lock 
    27   VK_ESCAPE   Esc 
    32   VK_SPACE    Spacebar 
    33   VK_PRIOR    Page Up 
    34   VK_NEXT    Page Down 
    35   VK_END     End 
    36   VK_HOME    Home 
    37    VK_LEFT    左箭头 
    38   VK_UP     上箭头 
    39   VK_RIGHT   右箭头 
    40   VK_DOWN    下箭头 
    41   VK_SELECT   可选 
    42   VK_PRINT   可选 
    43   VK_EXECUTE  可选 
    44   VK_SNAPSHOT  Print Screen 
    45   VK_INSERT   Insert 
    46   VK_DELETE  Delete 
    47   VK_HELP   可选 
    48~57  无      主键盘上的0~9 
    65~90  无      A~Z 
    96~105  VK_NUMPAD0~VK_NUMPAD9   Num Lock打开时数字键盘上的0~9 
    106   VK_NULTIPLY         数字键盘上的* 
    107   VK_ADD           数字键盘上的+ 
    108   VK_SEPARATOR        可选 
    109   VK_SUBTRACT         数字键盘上的- 
    110   VK_DECIMAL         数字键盘上的. 
    111   VK_DIVIDE          数字键盘上的/ 
    112~135 VK_F1~VK_F24        功能键F1~F24 
    144   VK_NUMLOCK         Num Lock 
    145   VK_SCROLL          Scroll Lock --------------------------------------------------------------------------------
    下边三个是MS键盘上的: --------------------------------------------------------------------------------十进制值 标识符 Microsoft自然键盘 --------------------------------------------------------------------------------91 VK_LWIN 左Windows键 
    92 VK_RWIN 右Windows键 
    93 VK_APPS Applications键 --------------------------------------------------------------------------------
    两种键盘消息: 
    非系统键 WM_KEYDOWN WM_KEYUP 
    系统键 WM_SYSKEYDOWN WM_SYSKEYUP 
     在键盘消息中,虚拟键码都保存在wParam参数中。这些虚拟键码的定义,是在winuser.h文件中,所以当用到键盘的虚拟键码时,要包含这个文件,不过,如果已经包含了windows.h文件,那么就不需要再包含winuser.h文件了,因为windows.h文件已经包含了winuser.h文件。 
     Print Screen键一般不需要处理。 
     VK_SELECT、VK_PRINT、VK_EXECUTE和VK_HELP很少出现。 
     数字和字母的虚拟键码是ASCII码。 
     F1~F24的功能键中,windows只用到了F1~F10。 
     用GetKeyState(int):(参数是以VK_开头的虚拟键码)获得所有有开关性质的键的状态(是否按下),比如shift、Alt等。用GetAsyncKeySate();获得当前某键的状态。 
     WM_SYSKEYDOWN和WM_SYSKEYUP消息由Windows系统函数使用,所以用户可以不管她。 
     WM_CHAR和WM_DEADCHAR消息是从WM_KEYDOWN得到的,而WM_SYSCHAR和WM_SYSDEADCHAR消息是从WM_SYSKEYDOWN消息得到的。在某些非U.S.英语键盘上,有些键用于给字母加上音调,因为它们本身不产生字符,所以称之为“死键”。 
     RegisterClass有两个版本,分别是ANSI版本的RegisterClassA和Uncode版本的RegisterClassW。如果程序用RegisterClass注册窗口类,那么当定义UNICODE标识符时就调用RegisterClassW,否则就调用RegisterClassA。同一窗口过程可能会用到两个窗口类,她们有可能用两种不同的版本注册。用下列函数可以获得窗口注册的类型: 
    fUnicode=IsWindowUnicode(hwnd);
    如果hwnd的窗口过程获得Unicode消息,那么变量fUnicode将为TRUE,,这表明窗口是基于用RegisterClassW注册的窗口类。 
     下一节将对过去的第三个程序做修改,以加上键盘控制。 911 
      

  3.   

    同意: yq3woaini 的方法