다른 프로그램에서 매크로를 실행하는 C # winforms 앱이 있습니다. 다른 프로그램은 계속해서 창을 띄우고 일반적으로 더 나은 단어가 없기 때문에 상황을 미치게 만듭니다. 프로세스 실행을 중지하는 취소 버튼을 구현하고 싶지만 창이 맨 위에 유지되지 않는 것 같습니다. C #에서 어떻게합니까?
편집 : 나는 TopMost = true를 시도했습니다; ,하지만 다른 프로그램은 계속해서 상단에 자체 창을 표시합니다. n 밀리 초마다 내 창을 맨 위로 보내는 방법이 있습니까?
편집 :이 문제를 해결 한 방법은 두 번 클릭하여 프로세스를 취소하는 시스템 트레이 아이콘을 추가하는 것입니다. 시스템 트레이 아이콘이 가려지지 않습니다. 응답 해 주신 모든 분들께 감사드립니다. 왜 ‘슈퍼 온탑’창이 없는지에 대한 기사를 읽었습니다. 논리적으로 작동하지 않습니다.
답변
답변
WinForms 응용 프로그램을 “Always on Top”으로 만들려고했지만 “TopMost”를 설정해도 아무런 효과가 없었습니다. WinAmp가이 작업을 수행하기 때문에 가능하다는 것을 알고있었습니다 (다른 여러 응용 프로그램과 함께).
내가 한 것은 “user32.dll”을 호출하는 것이 었습니다. 나는 그렇게하는 것에 대해 아무런 불만이 없었고 훌륭하게 작동합니다. 어쨌든 옵션입니다.
먼저 다음 네임 스페이스를 가져옵니다.
using System.Runtime.InteropServices;
클래스 선언에 몇 가지 변수를 추가합니다.
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
user32.dll 함수에 대한 프로토 타입을 추가합니다.
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
그런 다음 코드에서 (Form_Load ()에 호출을 추가했습니다) 호출을 추가하십시오.
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
도움이 되었기를 바랍니다. 참고
답변
“미쳐가는 것”이 각 창이 다른 창에서 계속 초점을 훔친다는 의미라면 TopMost는 문제를 해결하지 못할 것입니다.
대신 다음을 시도하십시오.
CalledForm.Owner = CallerForm;
CalledForm.Show();
이것은 초점을 훔치지 않고 ‘아이’형태를 보여줄 것입니다. 부모가 활성화되었거나 포커스가있는 경우에도 자식 양식은 부모 위에 유지됩니다. 이 코드는 소유자 양식 내에서 자식 양식의 인스턴스를 만든 경우에만 쉽게 작동합니다. 그렇지 않으면 API를 사용하여 소유자를 설정해야 할 수 있습니다.
답변
Form.TopMost 설정
답변
나는 순간적으로 5 분의 경과가 있었고 다음과 같이 전체 양식을 지정하는 것을 잊었습니다.
myformName.ActiveForm.TopMost = true;
그러나 내가 정말로 원했던 것은 이것이었다!
this.TopMost = true;
답변
양식의 .TopMost
속성을 true로 설정 합니다.
항상 이런 식으로 남겨두고 싶지는 않을 것입니다. 외부 프로세스가 시작될 때 설정하고 완료되면 다시 넣으십시오.
답변
이 문제를 해결 한 방법은 취소 옵션이있는 시스템 트레이 아이콘을 만드는 것입니다.