zoukankan      html  css  js  c++  java
  • C++模拟键盘消息

    实现功能:在现有DLL程序中向特定的EXE窗口中发送模拟键盘的消息
         使用API根据窗口标题递归查找特定的窗口句柄,之后模拟调用。
    注意:keybd_event函数不能在VS下使用,所以用SendInput代替使用:
     1 int SelfFindWindows(HWND hMainWnd, char* lpName, BYTE keyvalue) 
     2 { 
     3     HWND hChildWnd = GetWindow(hMainWnd, GW_CHILD); 
     4     
     5     while (hChildWnd != NULL) 
     6     {    
     7         char lpChildString[32] ={0}; 
     8         GetWindowText(hChildWnd, lpChildString, sizeof(lpChildString)); 
     9         
    10         if (strstr(lpChildString, lpName)) 
    11         { 
    12             SetForegroundWindow(hChildWnd); 
    13             SetFocus(hChildWnd); 
    14             
    15             /*
    16             keybd_event(keyvalue, 0, 0, 0); 
    17             keybd_event(keyvalue, 0, KEYEVENTF_KEYUP, 0); 
    18             */
    19             INPUT input[2];
    20             memset(input, 0, sizeof(input));
    21             //按下 向下方向键
    22             input[0].ki.wVk = keyvalue;
    23             input[0].type = INPUT_KEYBOARD;    
    24             //松开 向下方向键
    25             input[1].ki.wVk = keyvalue;
    26             input[1].type = INPUT_KEYBOARD;
    27             input[1].ki.dwFlags = KEYEVENTF_KEYUP;
    28             //该函数合成键盘事件和鼠标事件,用来模拟鼠标或者键盘操作。事件将被插入在鼠标或者键盘处理队列里面
    29             SendInput(2, input, sizeof(INPUT));        
    30             return 1; 
    31         } 
    32         
    33         if (GetWindow(hChildWnd, GW_CHILD)) 
    34         { 
    35             if (SelfFindWindows(hChildWnd, lpName, keyvalue)) 
    36             { 
    37                 return 1; 
    38             } 
    39         } 
    40     else 
    41         hChildWnd = GetWindow(hChildWnd, GW_HWNDNEXT); 
    42     } 
    43 
    44     return 0; 
    45 } 
    46 
    47 int SendKeyEventToEXE() 
    48 { 
    49     HWND hDesk = GetDesktopWindow(); 
    50     HWND hWnd = GetWindow(hDesk, GW_CHILD); 
    51     
    52     while (hWnd != NULL) 
    53     {    
    54         char lpString[32] ={0}; 
    55         GetWindowText(hWnd, lpString, sizeof(lpString)); 
    56         
    57         if (strstr(lpString, "Foxit Reader")) 
    58         { 
    59             SelfFindWindows(hWnd, "Reader", VK_NEXT);    
    60         
    61             return 1; 
    62         } 
    63         
    64         hWnd = GetWindow(hWnd, GW_HWNDNEXT); 
    65     } 
    66     return 0; 
    67 }

     附录:

    虚拟键码VK值大全(Virtual-Key_Codes):

    http://wenku.baidu.com/link?url=cH9r3Ycv2dGlYWjds56q4W-UsDCUgdvrJD3RuW9LZ3812jHqxnyXEZhW4aiAHbZLAxGa-UUgvbh_m3pHeGO5slLDjHHlUZJPF4VXX5x4-fm

     

  • 相关阅读:
    linux系统/var/log目录下的信息详解
    SQL 显示表名显示列名
    P2P平台介绍
    outlook署名最后一行没换行
    CSS3下的渐变文字效果实现
    SSH(poderosa)を使って、さくらのMySQLサーバーに接続する方法
    内网IP外网IP的关联及访问互联网原理
    自己吃的哑巴亏,怎么也要吞下去
    解决Ehcache缓存警告问题
    管理的艺术
  • 原文地址:https://www.cnblogs.com/dongsheng/p/4026878.html
Copyright © 2011-2022 走看看