思路是:
定义组合热键alt+1或者ctrl+1来模拟ctrl+c的复制操作,并将剪贴板的文本赋给某一变量。
   dim Astr as string
   Public Const MOD_ALT = &H1
   Public Const MOD_CONTROL = &H2
    
   ret = RegisterHotKey(Me.hwnd, 1, MOD_CONTROL, 48)
   ret = RegisterHotKey(Me.hwnd, 2, MOD_ALT, 48)     Clipboard.Clear
    keybd_event MOD_CONTROL, 0, 0, 0    
    keybd_event vbKeyC, 0, 0, 0    
    keybd_event vbKeyC, 0, KEYEVENTF_KEYUP, 0
    keybd_event MOD_CONTROL, 0, KEYEVENTF_KEYUP, 0
    sleep 1000
    Astr=Clipboard.GetText问题1:利用组合热键ctrl+1可以成功模拟,而alt+1则不能够,后面实践是ctrl+任何数都可以,而 alt则不行。问题2:ctrl+1可以成功模拟,而Clipboard.GetText在当时过程中确取不到值。非要等当时程序运行完成后,另外调用Clipboard.GetText才有值,怎么办?

解决方案 »

  1.   

    看不懂你的代码,注册热键做什么?直接发CTRL+C不就可以复制了?
    如果要用你自己定义的热键来做CTRL+C和CTRL+V的等效工作可不是这么简简单单几行代码能完成的,接收HOTKEY消息必须要你对FORM的消息处理函数进行重新的编写(就是所谓的子类化窗体),在那里面截获HOTKEY消息,再做和复制粘帖有关的事情(麻烦,要知道当前活动窗体是谁,被选中的又是什么),结果你还是发送CTRL+C或CTRL+V来做这个工作,绕了个远路,回到起点,没必要。SLEEP就是挂起进程,后面的代码必须等它返回后才有机会运行。
      

  2.   

    Public Const MOD_ALT = &H1
       Public Const MOD_CONTROL = &H2
    keybd_event MOD_CONTROL, 0, 0, 0   
    =====================
    这个keybd_event第一个参数是一个virtual-key 
    VK_LCONTROL的virtual_key是 A2 
    而你这里输入&1, &2只是对应于
    VK_LBUTTON 01 Left mouse button  
    VK_RBUTTON 01 Right mouse button  
    也就是说根本就没有按ctrl键但是为什么你定义热键为ctrl+xxx有用,alt没用呢
    因为你是在热键的回掉中调用. 热键的回掉是在热键被按下时产生的,
    你在ctrl+xxx的时候回掉, 所以当前ctrl被按下拉
    ctrl-->down
    接着你发送了
    c-->down c--->up 
    接着回掉结束后, 注册的热键弹起来了
    ctrl-->up
    于是这时还是"相当于"模拟了ctrl+c, 这时clipboard才有了东东.
    Astr=Clipboard.GetText这句是在回掉中, 也就是ctrl没有弹起来之前
    所以当然得不到.
    我认为sleep后也应该得不到, 因为回掉没结束应该收不到ctrl up消息
    (如果sleep后可以收到, 表示键盘消息这里是异步的)你只要把
    keybd_event MOD_CONTROL, 0, 0, 0  写成
    keybd_event &ha2, 0, 0, 0  
    后面的
    keybd_event MOD_CONTROL, 0, KEYEVENTF_KEYUP, 0
    keybd_event &ha2, 0, KEYEVENTF_KEYUP, 0