Windows Forms 창에서 hittest를 비활성화 할 수 있습니까? 그렇다면 어떻게해야합니까? 클릭 할 수없는 불투명 한 창을 갖고 싶습니다. 사전에Windows Form에서 hittests를 비활성화하려면 어떻게합니까?
감사합니다, 크리스토프
Windows Forms 창에서 hittest를 비활성화 할 수 있습니까? 그렇다면 어떻게해야합니까? 클릭 할 수없는 불투명 한 창을 갖고 싶습니다. 사전에Windows Form에서 hittests를 비활성화하려면 어떻게합니까?
감사합니다, 크리스토프
다른 프로세스와 대화하는 경우 Windows 메시지를 보내고 검색해야합니다.
이 링크에서보세요 : C#으로 글로벌 시스템 후크를 구현하기 위해 창 메시지를 사용http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx
글로벌 시스템 후크 수 있도록 다른 응용 프로그램을위한 Windows 메시지를 차단하는 응용 프로그램 . 이것은 C#에서 구현하기가 항상 어려웠습니다 (MSDN에 따르면 불가능했습니다). 이 기사에서는 후킹 응용 프로그램의 메시지 큐에 메시지를 게시하는 C++에서 DLL 래퍼를 만들어 전역 시스템 후크를 구현하려고합니다.
당신이 이동할 수 없습니다 수있는 창을 하시겠습니까? FormBorderStyle을 none으로 설정하십시오.
예, 창 이동이 불가능하고 FormBorderStyle이 none으로 설정되어 있어야합니다. 그러나 추가적으로 마우스 클릭이 아래 창으로 전파되기를 원합니다. 이자형. 창문에서 이벤트를 소비하지 않게하고 싶습니다. – Christoph
글쎄, 아직도 유스 케이스에 대해 많이 알지 못하지만, 어쨌든 찌르 게 될 것이고 간단한 예제를 제공 할 것이다.
플로팅 폼에서 기본 폼의 내용을 제어하려고한다고 가정합니다. 이렇게하려면 부동 양식의 기본 양식에 대한 참조가 필요합니다. 이 같은 기본 형식의 인스턴스를 받아 플로팅 형태의 생성자 과부하를 작성하여이 작업을 수행 :
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();
}
}
이제 텍스트가 기본 폼의 텍스트 상자에 표시됩니다.
응답 해 주셔서 감사합니다. 유스 케이스에 대한 몇 가지 세부 사항을 추가하겠습니다. 두 가지 양식이 두 가지 별도의 프로세스로 이루어져야한다는 것이 중요합니다. 두 가지 폼만 있으면 충분하지 않으며 두 가지 메시지 펌프 (응용 프로그램을 두 번 사용하는 것)가 충분하지 않습니다. Run() 다른 스레드에서. 백그라운드에서 양식을 모든 이벤트를 처리해야합니다 (별도의 프로세스에서) 앞에있는 부동 양식은 어떤 마우스 이벤트를 처리하지 않아야 오버레이 - 그것은 그것을 통해 백그라운드 양식을 통과해야합니다 . – Christoph
오버레이의 목적은 무엇입니까? 격리? –
3D 모드에서 동일한 프로세스에서 살 수없는 두 개의 가상 어스 컨트롤이 필요합니다. – Christoph
두 윈도우가 모두 제어 할 수 있으므로 앞 메시지의 이벤트를 전달합니다. 백그라운드 창에 루프를 명시 적으로, 나를 위해 최고의 솔루션을 보인다. – Christoph