文谷首页 | 业界传真 | 网络技术 | 服务器 | 数据库 | 存储技术 | 系统安全 | 无线技术 | Cisco | .Net | Windows | Linux | Unix | Java
电子商务 | 网站工程 | 网页设计 | 平面设计 | 多媒体 | 编程语言 | Oracle | MSSQL | Photoshop | ASP | PHP | 实用技巧 | 进程查询 | 文谷论坛
编程语言
 C++   Visual Basic   PowerBuilder   Delphi   C#   Java
您现在的位置: IT文谷 >> 编程语言 >> C++ >> 文章正文
模拟ctrl+alt+delete三键模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键
模拟ctrl+alt+delete三键
模拟ctrl+alt+delete三键模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键
模拟ctrl+alt+delete三键模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键

 

在我们编写远程控制软件的时候,我们会发现要想解锁server端我们就得发送这三个键的虚拟。

下面我说一下解决过程

1.一开始,决定通过keybd_event()来模拟键盘

 keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0);      keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),0,0);      keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),0,0);        keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),KEYEVENTF_KEYUP,0);     keybd_event(VK_MENU,MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);      keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0); 发现只能模拟ctrl+alt两个键的效果,然而其他的两个键的都可以模拟比如win+d。不知道是不是keybd_event()只能模拟两键还是因为ctrl+alt+delete的特殊性,望高手告之,在此谢过。

2.运用PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE));来发送虚拟键盘,但是在winNT以后的系统里我们还有很多事情要做,比如:OpenDesktop()、OpenInputDesktop()、GetThreadDesktop()、SetThreadDesktop()、CloseDesktop()、GetUserObjectInformation()

代码如下:

#include "windows.h"BOOL simulateAltControlDel();void main(){    simulateAltControlDel();}BOOL simulateAltControlDel(){    HDESK   hdeskCurrent;    HDESK   hdesk;    HWINSTA hwinstaCurrent;    HWINSTA hwinsta;    //     // Save the current Window station    //     hwinstaCurrent = GetProcessWindowStation();    if (hwinstaCurrent == NULL)        return FALSE;    //     // Save the current desktop    //     hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());    if (hdeskCurrent == NULL)        return FALSE;    //     // Obtain a handle to WinSta0 - service must be running    // in the LocalSystem account    //     hwinsta = OpenWindowStation("winsta0", FALSE,                              WINSTA_ACCESSCLIPBOARD   |                              WINSTA_ACCESSGLOBALATOMS |                              WINSTA_CREATEDESKTOP     |                              WINSTA_ENUMDESKTOPS      |                              WINSTA_ENUMERATE         |                              WINSTA_EXITWINDOWS       |                              WINSTA_READATTRIBUTES    |                              WINSTA_READSCREEN        |                              WINSTA_WRITEATTRIBUTES);    if (hwinsta == NULL)        return FALSE;    //     // Set the windowstation to be winsta0    //     if (!SetProcessWindowStation(hwinsta))     return FALSE;

    //     // Get the default desktop on winsta0    //     hdesk = OpenDesktop("Winlogon", 0, FALSE,                        DESKTOP_CREATEMENU |              DESKTOP_CREATEWINDOW |                        DESKTOP_ENUMERATE    |                        DESKTOP_HOOKCONTROL  |                        DESKTOP_JOURNALPLAYBACK |                        DESKTOP_JOURNALRECORD |                        DESKTOP_READOBJECTS |                        DESKTOP_SWITCHDESKTOP |                        DESKTOP_WRITEOBJECTS);    if (hdesk == NULL)       return FALSE;

    //     // Set the desktop to be "default"    //     if (!SetThreadDesktop(hdesk))       return FALSE;    PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT|MOD_CONTROL,VK_DELETE));

    //     // Reset the Window station and desktop    //     if (!SetProcessWindowStation(hwinstaCurrent))       return FALSE;

    if (!SetThreadDesktop(hdeskCurrent))    return FALSE;

    //     // Close the windowstation and desktop handles    //     if (!CloseWindowStation(hwinsta))        return FALSE;    if (!CloseDesktop(hdesk))        return FALSE;    return TRUE;}

偶一开始试验了发现不成功,后来冰河大哥告诉我说OpenDesktop("Winlogon", ......)本身需要LocalSystem权限,果然如此,把它注册成服务,然后效果实现。相信如何注册成服务不用我说了吧。ok,我们想要的功能实现了。

3.还有一种方法Dos下键盘的完全控制 ------- 一系列的BIOS级别的键盘控制函数!http://dev.csdn.net/develop/article/7/7181.shtm我没有试验,不知道可否,哪位大哥试验后告诉我一声

在此再次感谢黄鑫大哥!!

模拟ctrl+alt+delete三键模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键
  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    vc++学习精髓(收集,整理)
    谈无标题窗口的拖放
    VC6.0的若干实用小技巧
    让OGRE支持中文(二) ----支持TTF字体了
    一种全新的软件界面设计方法
    ADO编程中ATL所遇到的定义问题
    进程之间数据的共享:共用内存
    规范化编程:ANSI和UNICODE的使用
    利用C++编写Windows服务程序的一般框架
    在RichEdit中插入Bitmap
    关于OPENCV的源代码资料以及链接(zz)
    如何快速检测PocketPC是否已经连接到PC上
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 本站原创文章,转载时请注明出自文谷及作者姓名
    ③在本网BBS上发表言论者,文责自负。
    ④如您因版权等问题需要与本网联络,请在30日内联系 。
    模拟ctrl+alt+delete三键模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键
    模拟ctrl+alt+delete三键模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键2006-10-28 8:00:38模拟ctrl+alt+delete三键

    全站热点
    最新推荐
    关于文谷 | 联系文谷 | 免责声明 | 文谷论坛
    Tel: 0577-65690019      E-mail: ichenjian@gmail.com    MSN:ichenjian@hotmail.com    QQ:2911194
    Copyright © 2004-2008 wengu.com 文谷 All Rights Reserved
    浙ICP备05000327号