情况是这样的,在一个form类里已经写好keydown的响应事件我想用另一个单元通过 sendmessage(handle,vm_down) 这种方式通知form哪个按键给按下了。单个键按下已解决,可是类似 shift + ctrl + key 这种的不知道怎么解决,请问在消息里同时发送某个键的状态(例如是否处于按下状态)。在线等待!

解决方案 »

  1.   

    unit     Unit1;   
        
        interface   
        
        uses   
            Windows,     Messages,     SysUtils,     Variants,     Classes,     Graphics,     Controls,     Forms,   
            Dialogs;   
        
        type   
            TForm1     =     class(TForm)   
                procedure     FormCreate(Sender:     TObject);   
                procedure     FormMouseDown(Sender:     TObject;     Button:     TMouseButton;   
                    Shift:     TShiftState;     X,     Y:     Integer);   
            private   
                {     Private     declarations     }   
            public   
                {     Public     declarations     }   
            end;   
        
        var   
            Form1:     TForm1;   
        
        implementation   
        
        {$R     *.dfm}   
        
        procedure     TForm1.FormCreate(Sender:     TObject);   
        var   
        rect:TRect;   
        x,y,lPara:Integer;   
        begin   
        GetWindowRect(Self.Handle,rect);//获得当前窗口的位置   
        x:=rect.Left+10;                                   //当前窗口左上角x坐标加10   
        y:=rect.Top+10;                                   //当前窗口左上角y坐标加10   
        lPara:=x+(y     shl     16);                           //就算出lParam的值   
        
        //向当前窗口发送左键按下消息,相当于鼠标在相对窗口(10,10)的位置按下   
        PostMessage(Self.Handle,WM_LBUTTONDOWN,MK_LBUTTON,lpara);   
        
        end;   
        
        //相应鼠标按下事件   
        procedure     TForm1.FormMouseDown(Sender:     TObject;     Button:     TMouseButton;   
            Shift:     TShiftState;     X,     Y:     Integer);   
        begin   
        showmessage('WM_lbuttondown     在     '     +     IntToStr(X)     +     ','+     IntToStr(y));   
        end;   
        
        end.   
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////简单点的可以用键盘/鼠标     事件   
        给你个键盘事件的例子:   
        
        unit     Unit1;   
        
        interface   
        
        uses   
            Windows,     Messages,     SysUtils,     Variants,     Classes,     Graphics,     Controls,     Forms,   
            Dialogs,     StdCtrls;   
        
        type   
            TForm1     =     class(TForm)   
                edit1:     TEdit;   
                Button1:     TButton;   
                procedure     Button1Click(Sender:     TObject);   
            private   
                {     Private     declarations     }   
            public   
                {     Public     declarations     }   
            end;   
        
        var   
            Form1:     TForm1;   
        
        implementation   
        
        {$R     *.dfm}   
        
        procedure     TForm1.Button1Click(Sender:     TObject);   
        const   
        vk_o=79;   
        vk_k=75;   
        begin   
        edit1.SetFocus;   
        keybd_event     (VK_O,     0,     0,     0);         //press     H   
        keybd_event     (VK_O,     0,     KEYEVENTF_KEYUP,     0);         //     release     H   
        keybd_event     (VK_K,     0,     0,     0);         //press     H   
        keybd_event     (VK_K,     0,     KEYEVENTF_KEYUP,     0);         //     release     H   
        end;   
        
        end.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////procedure     TForm1.Button1Click(Sender:     TObject);   
        begin   
        
        winexec('notepad',1);   
        //把记事本窗口激活   
        setforegroundwindow(findwindow(nil,'无标题-记事本'));   
        
        //模拟输入     'abc'   
        keybd_event(65,0,KEYEVENTF_EXTENDEDKEY     or     0,0);   
        keybd_event(65,0,KEYEVENTF_EXTENDEDKEY     or     KEYEVENTF_KEYUP,0);   
        keybd_event(66,0,KEYEVENTF_EXTENDEDKEY     or     0,0);   
        keybd_event(66,0,KEYEVENTF_EXTENDEDKEY     or     KEYEVENTF_KEYUP,0);   
        
        keybd_event(67,0,KEYEVENTF_EXTENDEDKEY     or     0,0);   
        keybd_event(67,0,KEYEVENTF_EXTENDEDKEY     or     KEYEVENTF_KEYUP,0);   
        
        //模拟     alt     +     F     打开文件菜单   
        keybd_event(VK_MENU,0,KEYEVENTF_EXTENDEDKEY     or     0,0);   
        keybd_event(70,0,KEYEVENTF_EXTENDEDKEY     or     0,0);   
        keybd_event(70,0,KEYEVENTF_EXTENDEDKEY     or     KEYEVENTF_KEYUP,0);   
        keybd_event(VK_MENU,0,KEYEVENTF_EXTENDEDKEY     or     KEYEVENTF_KEYUP,0);   
        
        //模拟输入     按     s       保存   
        keybd_event(83,0,KEYEVENTF_EXTENDEDKEY     or     0,0);   
        keybd_event(83,0,KEYEVENTF_EXTENDEDKEY     or     KEYEVENTF_KEYUP,0);   
        end;