2016-08-16 6 views
3
를 감지하지 UserControl을

가이에 대한 질문 (one, two, three, four, five)의 많은,하지만 난 그들 모두에서 수정을 시도하고 그들 중 하나가 작동하지 여부를합니까 내 목적에 부합한다. 여기 내 기본 구조입니다 : 승리 양식은 키 입력

User Control 
|-Panel 
    |-Picture Box (several of them, created at runtime, do not exist at design time) 

내가 관련되어 있다고 생각하기 때문에

, 패널이 "입력"과 "성장과 축소"로 설정 크기를 조정하는 설정의 독을 가지고, 그래서 항상 전체 사용자 정의 컨트롤을 포함한다. PictureBox는 항상 패널의 일부를 덮지 만 대개 가능하지는 않습니다.

나는 특별히 Ctrl + C을 듣고 있는데, 어떤 아이가 포커스를 가지고 있든 상관없이 응답 할 수있는 방법이 필요합니다. 임의 키 프레스를들을 수있는 메서드가 필요하므로 나중에 확장 할 수 있습니다.

링크 된 페이지에 대한 답변 중 하나는 이러한 키 프레스에 대한 글로벌 수신기를 만드는 것이지 배경 응용 프로그램 인 경우이를 수행하고 싶지 않기 때문에 그렇게하지 않으려 고합니다. 또 다른 방법은 최상위 양식에서이를 감지하고 내 사용자 정의 컨트롤로 필터링하는 것입니다. 문제는 DLL에 User Control이 내장되어 있고, 이것을 사용하여 응용 프로그램을 강제 실행하지 않고 Ctrl + C을 청취해야한다는 것입니다. 이것은 독자적으로 처리해야하는 문제입니다. 링크 위에서 나

1) 작동하지 않은 이유는

나는 내 UserControl을 true로 설정할 수있는 KeyPreview 속성이 없습니다. 그 질문에 대한 두 번째 대답은 내가했던 ProcessCmdKey를 재정의하는 것이지만 콜백은 내가 무엇을 시도하든 관계없이 호출되지 않는다.

2)이 또한 ProcessCmdKey를 재정의 할 것을 제안합니다. 내가 말했듯이 결코 부름을받지 않습니다.

3) 내가 사실로 설정할 수있는 동의 버튼이 없습니다.

4) KeyDownPreviewKeyDown 콜백이 모두 구현되었으며 둘 중 어느 것도 호출되지 않았습니다.

5) ProcessCmdKey를 제안합니다.

포커스에 관계없이 사용자 컨트롤에서 키 이벤트를 어떻게 검색합니까? 또는, 시도한 위의 방법이 작동해야한다면, 내가 놓친 설정이 작동하지 않도록하고 있습니까?

답변

1

OP : 나는 특히 Ctrl + C을 수신하고, 나는 아이 포커스가있는 응답에 관계없이 할 수있는 방법이 필요합니다.

당신이 포커스가없는 경우에도 컨트롤에서 + Ctrl 키와 같은 C을 키 조합을 처리하는 경우 또는 그 선택이 아니라면, 당신은 사용자 정의 컨트롤에 보이지 않는 MenuStrip를 추가하고 추가 할 수 있습니다 항목을 추가하고 바로 가기를 할당하십시오. 그런 다음 항목의 클릭 이벤트를 처리하고 필요한 것을 수행하십시오.

click 이벤트는 때마다 컨트롤에 포커스를 포함하지 않는 경우에도 사용자 프레스 Ctrl 키 + C을 발생합니다.

또한이 코드를 사용하여 수행 할 수 있습니다

public UserControl1() 
{ 
    InitializeComponent(); 
    var menu = new MenuStrip(); 
    var item = new ToolStripMenuItem(); 
    item.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C; 
    item.Click += item_Click; 
    menu.Items.Add(item); 
    menu.Visible = false; 
    this.Controls.Add(menu); 
} 
void item_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("Ctrl + C"); 
} 

참고

당신은 초점을 가지고 있지만, MenuStrip를 사용하지 않고 키 이벤트를 처리 할 수 ​​할 수 있습니다 사용하려는 트랩 바로 가기 키 위의 방법.

그것이 작동하게하는 이유는 FormToolStripManager의 모든 비의 ContextMenu 스트립 공정 단축을 야기하고 ContainerControlContainerControl 호출 ProcessCmdKeyToolStripManager.ProcessCmdKey 방법이다.
자세한 내용은 source code (ContainerControl.ProcessCmdKey)을 참조하십시오.

+0

이것은 내가 본 것 중 가장 해킹이 덜한 것처럼 보입니다. 내가 너의 방식대로 그것을 끝내면 나는 이것을 받아 들일 것이다. – Cody

+0

문제 없습니다. 유용 할 수 있습니다 :) –

+0

작동하게 만드는 이유는'Form'은'ContainerControl'이고'ContainerControl'는'ProcessCmdKey'의'ToolStripManager.ProcessCmdKey' 메소드를 호출하여 비 컨텍스트 메뉴 스트립의 바로 가기를 처리하게 만듭니다 ToolStripManager의 자세한 내용은'ContainerControl.ProcessCmdKey'에 대한 [소스 코드] (http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ContainerControl.cs,2934e842fd63bf41)를 참조하십시오. . –

3

포커스가있는 컨트롤에서 키 입력 이벤트가 발생합니다. 포커스를 얻지 않고 포커스를 표시하지 않고 키 입력 자체를 사용하지 않으려는 컨트롤을 선택했습니다. 어떤 사용자가 앱의 사용자가 을 알면에 Ctrl + C가 무엇을 할 것인지를 묻습니다.

Ctrl + C는 PictureBox의 이미지를 클립 보드로 복사한다고 가정합니다. PB에서 자신의 클래스를 파생시키고 수정하여 포커스를 표시하도록하는 것이 가장 좋습니다. 프로젝트에 새 클래스를 추가하고 아래 표시된 코드를 붙여 넣습니다. 엮다. 도구 상자 맨 위에서 드래그하여 사용자 정의 컨트롤의 PB를 바꿉니다.

using System; 
using System.Windows.Forms; 
using System.Drawing; 

class SelectablePictureBox : PictureBox { 
    public SelectablePictureBox() { 
     this.SetStyle(ControlStyles.Selectable, true); 
     this.TabStop = true; 
    } 
    protected override void OnMouseDown(MouseEventArgs e) { 
     if (e.Button == MouseButtons.Left) this.Focus(); 
     base.OnMouseDown(e); 
    } 
    protected override void OnEnter(EventArgs e) { 
     this.Invalidate(); 
     base.OnEnter(e); 
    } 
    protected override void OnLeave(EventArgs e) { 
     this.Invalidate(); 
     base.OnLeave(e); 
    } 
    protected override void OnPaint(PaintEventArgs e) { 
     base.OnPaint(e); 
     if (this.Focused) { 
      var rc = this.DisplayRectangle; 
      rc.Inflate(new Size(-2, -2)); 
      ControlPaint.DrawFocusRectangle(e.Graphics, rc); 
     } 
    } 
} 
+0

사용자가 Ctrl + C의 기능을 알 수 있다고 말하면서 시작합니다. 여기서는 (NDA와 모두) 말할 수는 없지만 상황에 맞는 말이됩니다. 또한 그들은 이미지를 복사하지 않고 텍스트를 복사합니다. 이미지를 이미 텍스트로 스캔 할 수 있으며 선택하려고하는 것을 알 수 있습니다. 이미 해당 정보가로드 된 문자열이 있습니다. Word에서 일부 텍스트를 강조 표시 할 수 있으며 마우스가 창 (또는 그 외부)에 관계없이 Ctrl + C는 계속 복사합니다. 그 (선호) 응용 프로그램이 활성화되어 있지 않을 때 그것을 잡을 것입니다 전역 수신기를 사용하지 않는 동안 그 기능을해야합니다. – Cody

+1

글쎄, 그건 정말 관련이 없어요, 그냥이 컨트롤을 사용하고 당신이하고 싶은 일을 할 OnKeyDown() 메서드를 재정의하십시오. –