如果是输入A,用WM_KEYDOWN就行了,如果是ALT+A好像就不止一种方式了。可以是在param中的某位设定(有一位是表示Alt是否按下的),还可以是另外一种消息吧好像。
原来写一个小游戏的外挂的时候做过类似的程序,不过很久了,已经忘得差不多了,呵呵~硬盘格过所以没源码了,不然就解决你得问题了~你可以查查MSDN得,里面应该有。

解决方案 »

  1.   

    从你所述来看,目标窗口应该是WIN32窗体吧.如是那样使用SendInput函数,具体用法可以看MSDN. 可以在网上搜一下这方面的例子.
      

  2.   

    去网上搜索一下记录键盘动作的外挂相关的文章会对你有帮忙的。
    wParam好像是按键对应的16进制数,而lParam是一些标志位吧,隐约的影响,供你参考。
      

  3.   

    好像可以使用System.Windows.Forms.SendKeys.Send()函数模拟实现的。
    如:
    System.Windows.Forms.SendKeys.Send("{TAB}");//模拟发送tab键
    也可以发送组合键,请参看msdn中关于SendKeys类的介绍。
      

  4.   

    using System;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Windows.Forms;namespace xajhAuto
    {
    /// <summary>
    /// remoteClass 的摘要说明。
    /// </summary>
    public class remoteClass
    {
    public remoteClass()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    #region keyboard event
    [DllImport("user32.dll", EntryPoint="keybd_event")]
    public static extern void keybd_event (
    byte bVk,
    byte bScan,
    int dwFlags,
    int dwExtraInfo
    );
    /// <summary>
    /// 模拟按下一个按键
    /// </summary>
    /// <param name="keyValue">要摹拟的按键的键值</param>
    public void keyDown(byte keyValue)
    {
    keybd_event(keyValue,(byte)0,0,0);
    }
    /// <summary>
    /// 模拟释放一个按键
    /// </summary>
    /// <param name="keyValue">要摹拟的按键的键值</param>
    public void keyPress(byte keyValue)
    {
    keybd_event(keyValue,0,2,0);
    }
    /// <summary>
    /// 模拟一次完整的按键过程
    /// </summary>
    /// <param name="keyValue">要摹拟的按键的键值</param>
    public void key(byte keyValue)
    {
    keybd_event(keyValue,0,0,0);
    keybd_event(keyValue,0,2,0);
    }
    /// <summary>
    /// 模拟一次完整的按键过程
    /// </summary>
    /// <param name="keyValue">要摹拟的按键的键值</param>
    /// <param name="ptr">要处理的窗口句柄</param>
    public void key(byte keyValue,int ptr)
    {
    keybd_event(keyValue,0,0,ptr);
    keybd_event(keyValue,0,2,ptr);
    }
    #endregion
    #region cut screen
    [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
    private static extern bool BitBlt (
    IntPtr hdcDest , // 目标 DC的句柄
    int nXDest , 
    int nYDest , 
    int nWidth , 
    int nHeight , 
    IntPtr hdcSrc ,  // 源DC的句柄
    int nXSrc , 
    int nYSrc , 
    System.Int32 dwRop  // 光栅的处理数值
    ) ;
    /// <summary>
    /// 截屏
    /// </summary>
    /// <returns></returns>
    public Stream GetImage()
    {
    //得到一个最大化没有标题栏的窗体,为了截取整个屏幕
    Form f=new Form();
    f.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None;
    f.WindowState=System.Windows.Forms.FormWindowState.Maximized;
    //获得当前屏幕的大小
    Rectangle rect = new Rectangle () ;
    rect = Screen.GetBounds (f) ;
    //创建一个以当前屏幕为模板的图象
    Graphics g1 = f.CreateGraphics ( ) ;
    //创建以屏幕大小为标准的位图 
    Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ;
    Graphics g2 = Graphics.FromImage ( MyImage ) ;
    //得到屏幕的DC
    IntPtr dc1 = g1.GetHdc ( ) ;
    //得到Bitmap的DC 
    IntPtr dc2 = g2.GetHdc ( ) ;
    //调用此API函数,实现屏幕捕获
    BitBlt( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
    //释放掉屏幕的DC
    g1.ReleaseHdc ( dc1 ) ;
    //释放掉Bitmap的DC 
    g2.ReleaseHdc ( dc2 ) ;
    f.Dispose();
    Stream s=new System.IO.MemoryStream();
    //以JPG文件格式来保存
    MyImage.Save(s,ImageFormat.Jpeg);
    MyImage.Dispose();
    return s;
    } #endregion
    #region cdrom event
    [DllImport("winmm.dll")]
    public static extern long mciSendStringA (string lpstrCommand,string lpstrReturnString,long uReturnLength,long hwndCallback);
    // lpstrCommand    这是控制命令参数
    //   lpstrReturnString  这是返回值
    //   uReturnLength 返回值长度参数
    /// <summary>
    /// 打开光驱
    /// </summary>
    public void OpenCDRom()
    {
    mciSendStringA("set CDAudio door open", "", 0, 0);
    }
    /// <summary>
    /// 关闭光驱
    /// </summary>
    public void CloseCDRom()
    {
    mciSendStringA("set CDAudio door closed", "", 0, 0);
    } #endregion #region lock mouse
    [StructLayout(LayoutKind.Explicit)]  
    public struct Rect 
    {  
    [FieldOffset(0)] public int left;  
    [FieldOffset(4)] public int top;  
    [FieldOffset(8)] public int right;  
    [FieldOffset(12)] public int bottom;  

    [DllImport("User32.dll")]
    public static extern void ClipCursor(ref Rect rect);
    /// <summary>
    /// 锁定鼠标在特定的矩形区域
    /// </summary>
    /// <param name="top">top</param>
    /// <param name="left">left</param>
    /// <param name="right">right</param>
    /// <param name="buttom">buttom</param>
    public void lockMouse(int top,int left,int right,int buttom)
    {
    Rect r;
    r.bottom=buttom;
    r.left=left;
    r.top=top;
    r.right=right;
    ClipCursor(ref r);
    }
    #endregion #region mouse click
    //鼠标单击事件
    //mouse_event API中的鼠标模拟方法
    [DllImport("User32.dll")]
    public static extern void mouse_event(int dwFlags,int dx,int dy,uint dwData,ulong dwExtraInfo);
    private const int MOUSEEVENTF_LEFTDOWN=2;
    private const int MOUSEEVENTF_LEFTUP=4;
    private const int MOUSEEVENTF_RIGHTDOWN=8;
    private const int MOUSEEVENTF_RIGHTUP=16;


    [DllImport("User32.dll")]
    public static extern bool SetCursorPos(int x,int y);//定位鼠标的位置 /// <summary>
    /// 模拟鼠标左键单击
    /// </summary>
    /// <param name="x">x的相对屏幕的相对位置</param>
    /// <param name="y">y的相对屏幕的相对位置</param>
    public void mouse_Click(float x,float y)
    {
    //计算相对于屏幕的绝对位置
    int screenX=(int)(x*Screen.PrimaryScreen.Bounds.Width);
    int screenY=(int)(y*Screen.PrimaryScreen.Bounds.Height);
    //在屏幕上定位鼠标事件的位置
    SetCursorPos(screenX,screenY);
    mouse_event(MOUSEEVENTF_LEFTDOWN,screenX,screenY,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,screenX,screenY,0,0);
    }
    /// <summary>
    /// 模拟鼠标左键双击
    /// </summary>
    /// <param name="x">x的相对屏幕的相对位置</param>
    /// <param name="y">y的相对屏幕的相对位置</param>
    public void mouse_DoubleClick(float x,float y)
    {
    int screenX=(int)(x*Screen.PrimaryScreen.Bounds.Width);
    int screenY=(int)(y*Screen.PrimaryScreen.Bounds.Height);
    SetCursorPos(screenX,screenY);
    mouse_event(MOUSEEVENTF_LEFTDOWN,screenX,screenY,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,screenX,screenY,0,0);
    mouse_event(MOUSEEVENTF_LEFTDOWN,screenX,screenY,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,screenX,screenY,0,0);
    }
    /// <summary>
    /// 模拟鼠标右键单击
    /// </summary>
    /// <param name="x">x的相对屏幕的相对位置</param>
    /// <param name="y">y的相对屏幕的相对位置</param>
    public void mouse_rightClick(float x,float y)
    {
    int screenX=(int)(x*Screen.PrimaryScreen.Bounds.Width);
    int screenY=(int)(y*Screen.PrimaryScreen.Bounds.Height);
    SetCursorPos(screenX,screenY);
    mouse_event(MOUSEEVENTF_RIGHTDOWN,screenX,screenY,0,0);
    mouse_event(MOUSEEVENTF_RIGHTUP,screenX,screenY,0,0);
    }
    #endregion
    }
    }