2009-05-30 8 views

답변

0

다른 프로세스와 대화하는 경우 Windows 메시지를 보내고 검색해야합니다.

http://www.c-sharpcorner.com/UploadFile/thmok/SendingWindowsMessageinCSharp11262005042819AM/SendingWindowsMessageinCSharp.aspx

이 링크에서보세요 : C#으로 글로벌 시스템 후크를 구현하기 위해 창 메시지를 사용

http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

글로벌 시스템 후크 수 있도록 다른 응용 프로그램을위한 Windows 메시지를 차단하는 응용 프로그램 . 이것은 C#에서 구현하기가 항상 어려웠습니다 (MSDN에 따르면 불가능했습니다). 이 기사에서는 후킹 응용 프로그램의 메시지 큐에 메시지를 게시하는 C++에서 DLL 래퍼를 만들어 전역 시스템 후크를 구현하려고합니다.

+0

두 윈도우가 모두 제어 할 수 있으므로 앞 메시지의 이벤트를 전달합니다. 백그라운드 창에 루프를 명시 적으로, 나를 위해 최고의 솔루션을 보인다. – Christoph

0

당신이 이동할 수 없습니다 수있는 창을 하시겠습니까? FormBorderStyle을 none으로 설정하십시오.

+0

예, 창 이동이 불가능하고 FormBorderStyle이 none으로 설정되어 있어야합니다. 그러나 추가적으로 마우스 클릭이 아래 창으로 전파되기를 원합니다. 이자형. 창문에서 이벤트를 소비하지 않게하고 싶습니다. – Christoph

0

글쎄, 아직도 유스 케이스에 대해 많이 알지 못하지만, 어쨌든 찌르 게 될 것이고 간단한 예제를 제공 할 것이다.

플로팅 폼에서 기본 폼의 내용을 제어하려고한다고 가정합니다. 이렇게하려면 부동 양식의 기본 양식에 대한 참조가 필요합니다. 이 같은 기본 형식의 인스턴스를 받아 플로팅 형태의 생성자 과부하를 작성하여이 작업을 수행 :

public FloatingForm(MainForm mainForm) 
    { 
     InitializeComponent(); 
     _mainForm = mainForm; 
    } 

떠있는 형태 floatingFormTextBox라는 이름의 텍스트 상자 및 Button1을이라는 버튼이 포함되어 있습니다. 부동 양식의 부분 클래스는 다음과 같습니다.

public partial class FloatingForm : Form 
{ 
    MainForm _mainForm; 

    public FloatingForm() 
    { 
     InitializeComponent(); 
    } 

    public FloatingForm(MainForm mainForm) 
    { 
     InitializeComponent(); 
     _mainForm = mainForm; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _mainForm.DoSomething(floatingFormTextBox.Text); 
    } 
} 

기본 폼에는 mainFormTextBox라는 텍스트 상자 만 있습니다. 기본 폼이로드되면 부동 양식의 인스턴스가 만들어지고 부동 양식의 새 생성자 오버로드에 자체에 대한 참조가 전달됩니다. 기본 폼에 대한 부분 클래스는 다음과 같습니다 : 나는 부동 양식의 텍스트 상자에 텍스트를 넣고 버튼을 클릭하면

public partial class MainForm : Form 
{ 
    FloatingForm _floatingForm; 

    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    public void DoSomething(string text) 
    { 
     mainFormTextBox.Text = text; 
     this.Refresh(); 
    } 

    private void MainForm_Load(object sender, EventArgs e) 
    { 
     _floatingForm = new FloatingForm(this); 
     _floatingForm.Show(); 
    } 
} 

이제 텍스트가 기본 폼의 텍스트 상자에 표시됩니다.

+0

응답 해 주셔서 감사합니다. 유스 케이스에 대한 몇 가지 세부 사항을 추가하겠습니다. 두 가지 양식이 두 가지 별도의 프로세스로 이루어져야한다는 것이 중요합니다. 두 가지 폼만 있으면 충분하지 않으며 두 가지 메시지 펌프 (응용 프로그램을 두 번 사용하는 것)가 충분하지 않습니다. Run() 다른 스레드에서. 백그라운드에서 양식을 모든 이벤트를 처리해야합니다 (별도의 프로세스에서) 앞에있는 부동 양식은 어떤 마우스 이벤트를 처리하지 않아야 오버레이 - 그것은 그것을 통해 백그라운드 양식을 통과해야합니다 . – Christoph

+0

오버레이의 목적은 무엇입니까? 격리? –

+0

3D 모드에서 동일한 프로세스에서 살 수없는 두 개의 가상 어스 컨트롤이 필요합니다. – Christoph

관련 문제