2012-02-06 3 views
2

질문 : this 질문에서 언급했듯이 커서를 잠깐 동안 (예 : 3-5 초) 커서를 두 번 두 번 클릭하면 응용 프로그램에 기능을 구현하려고합니다. 해당 스레드에서 제공되는 응답에 따라 다음과 같이 썼습니다. 이 코드는 예상대로 작동하지 않습니다. 누군가 제발 도와 줄 수 있니?타이머를 사용하여 더블 클릭 이벤트 구현하기

#region Timer Mouse Double Click event 

    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 

    //Here, the timer for Timer click event will start when mouse hovers over an area 
    private void form_MouseHover(object sender, System.EventArgs e) 
    { 
     timer.Start(); 
    } 

    private void form_MouseLeave(object sender, System.EventArgs e) 
    { 
     timer.Stop(); 
    } 

    void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     timer.Stop(); 
     DoubleClickEvent(); 
    } 

    //This method allows the user to click a file/folder by hovering/keeping still the mouse for specified time 
    void DoubleClickEvent() 
    { 

     DoClickMouse(0x2);  // Left mouse button down 
     DoClickMouse(0x4);  // Left mouse button up 
    } 

    static void DoClickMouse(int mouseButton) 
    { 
     var input = new INPUT() 
     { 
      dwType = 0, // Mouse input 
      mi = new MOUSEINPUT() { dwFlags = mouseButton } 
     }; 

     if (SendInput(1, input, Marshal.SizeOf(input)) == 0) 
     { 
      throw new Exception(); 
     } 
    } 
    [StructLayout(LayoutKind.Sequential)] 
    struct MOUSEINPUT 
    { 
     int dx; 
     int dy; 
     int mouseData; 
     public int dwFlags; 
     int time; 
     IntPtr dwExtraInfo; 
    } 
    struct INPUT 
    { 
     public uint dwType; 
     public MOUSEINPUT mi; 
    } 
    [DllImport("user32.dll", SetLastError = true)] 
    static extern uint SendInput(uint cInputs, INPUT input, int size); 

    #endregion 
+1

여기서 작동하지 않는 항목은 무엇입니까? – Tigran

+0

더블 클릭 이벤트가 전혀 발생하지 않습니다! – ykombinator

+0

나는 [Reactive Extensions] (http://stackoverflow.com/questions/5228364/reactive-framework-doubleclick)를 사용하여 제안을 제안합니다. –

답변

1

나는 그것이 두 답변을 제공하기 위해 나쁜 에티켓하지 희망, 그러나 이것은 내가 얻지 못한 개선을 위해 편집을 느꼈다 내 이전 대답은 매우 다르다 맞다.

폼의 MouseLeave 이벤트를 트리거하는 폼의 컨트롤 위로 마우스를 가져 가면 폼의 이벤트 처리기 만 있습니다.

필요한 것은 폼의 모든 컨트롤에 이벤트 처리기를 추가하는 것입니다. 이렇게하는 것이 좋습니다.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

     this.MouseHover += new EventHandler(MouseHoverEvent); 
     this.MouseLeave +=new EventHandler(MouseLeaveEvent); 
     timer1.Tick += new EventHandler(timer1_Tick); 

     foreach (Control item in this.Controls) 
     { 
      item.MouseHover += new EventHandler(MouseHoverEvent); 
      item.MouseLeave += new EventHandler(MouseLeaveEvent); 
     } 

    } 

    void timer1_Tick(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     DoubleClickEvent(); 
    } 

    void MouseLeaveEvent(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
    } 

    void MouseHoverEvent(object sender, EventArgs e) 
    { 
     timer1.Start(); 
    } 
} 
2

언뜻보기에 두 번 클릭하면 한 번의 클릭 만하고 있습니다.

위로 마우스를 한 번 클릭하면됩니다.

void DoubleClickEvent() 
{ 
    DoClickMouse(0x2);  // Left mouse button down 
    DoClickMouse(0x4);  // Left mouse button up   
    DoClickMouse(0x2);  // Left mouse button down 
    DoClickMouse(0x4);  // Left mouse button up 
} 
0

하나 개의 어레이의 모든 마우스 다운 및 업을 통과 SendInput을 단일 호출로이 코드를 작성하는 것이 좋습니다 수 있습니다. 이렇게하면 SendInput은 시퀀스간에 다른 키가 들어 가지 않도록합니다. 예를 들어, 사용자가 이론적으로 Alt + N 키를 보유하고 있으면 누설 될 수 있습니다. 예를 클릭하면 자동 크리커가 No (Alt + N 키를 누른 상태에서)를 트리거합니다.

그러나 말했다되는 것을 나는 우리의 질문에 대한 답이 여기에 생각 : SendInput doesn't perform click mouse button unless I move cursor

0

기본 아이디어 : 나는 태양 아래 모든 것을 오버라이드 (override) 할 필요가 없도록 내가 MouseAdapter를 사용합니다.

내 MouseAdapter 개체에는 스윙 타이머를 확장하는 MouseTimer, 및 재정의 된 익명 actionPerformed 메서드가있는 ActionListener가 있습니다.

나는 타이머 오브젝트를 시작하고 중지 할 때 생각해 보았다. 기본적으로 클릭 한 번 또는 두 번 클릭했을 때 인쇄됩니다.

package mouseUtils; 

import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.Timer; 

/** 
* 
* @author jcpartri 
*/ 
public class MyMouseAdapter extends MouseAdapter{ 
    private Integer mouseDoubleClickInterval = (int)  
    Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 
    private MouseEvent event = null; 
    private ActionListener taskPerformer = new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      if(event.getClickCount() == 2){ 
       //mouseDoubleClicked(event); 
       mouseTimer.stop(); 
      } 
      if(event.getClickCount() == 1){ 
       //mouseSingleClicked(event); 
       mouseTimer.stop(); 

      } 
    } 
}; 

클래스 MouseTimer는 Timer 클래스의 하위 클래스입니다. 타이머가 지체 된 후에 타이머가 작동하면 해당 시간 범위 내에 한 번 또는 두 번 클릭했는지 확인하는 검사가 있습니다.

private MouseTimer mouseTimer = new 

MouseTimer(getMouseDoubleClickInterval(),taskPerformer); 

//The DebugClock helps me to see how long a process that I have programmed takes from 
start to finish. 
    private DebugClock clock = new DebugClock(); 

//Constructors 
public MyMouseAdapter(){ 
     super(); 
} 


@Override 
public void mouseClicked(MouseEvent e){ 
    event = e; 
    if(e.getClickCount() == 1){ 
      mouseTimer.setInitialDelay(mouseDoubleClickInterval); 
      mouseTimer.start(); 
    } 
    mouseTimer.setNumOfClicks(); 
} 

public void mouseSingleClicked(MouseEvent e){ 
    p("Mouse was SingleClicked!!!\n"); 
} 
public void mouseDoubleClicked(MouseEvent e){ 
    p("Mouse was DoubleClicked!!!\n"); 
} 
@Override 
public void mouseMoved(MouseEvent e){ 
    event = e; 
    mouseTimer.resetNumOfClicks(); 
    mouseTimer.stop(); 
} 

//Setters and Getters for MouseAdapter 
public Integer getMouseDoubleClickInterval(){ 
     return this.mouseDoubleClickInterval; 
} 



    //Timer Classes 
    private class MouseTimer extends Timer{ 

    //Constructors 
    public MouseTimer(int delay, ActionListener taskPerformer){ 
      super(delay,taskPerformer); 
    } 

    //Instance variables 
    private int numOfClicks = 0; 


     //Setters and Getters 
     public int getNumOfClicks(){ 
      return this.numOfClicks; 
     } 
     public void setNumOfClicks(){ 
      this.numOfClicks++; 
     } 
     public void resetNumOfClicks(){ 
      this.numOfClicks = 0; 
     } 
    } 
    //Basic Printing Classes 
    private void p(String message){ 
    System.out.print(message); 
    } 
} 

class DebugClock{ 
    private long startTime = 0; 
    private long endTime = 0; 

    //Setters and Getters 
    public long getStartTime(){ 
      return this.startTime; 
    } 
    public void setStartTime(long start){ 
      this.startTime = start; 
    } 
    public long getEndTime(){ 
      return this.endTime; 
    } 
    public void setEndTime(long end){ 
      this.endTime = end; 
    } 

    //Constructors 
    public DebugClock(){ 

    } 

    //Methods 
    public float getTimeInMilliSeconds(){ 
      float seconds = (this.endTime - this.startTime); 
      return seconds; 
    } 
} 
관련 문제