উইন্ডোটি কীভাবে সর্বদা। নেট এ শীর্ষে থাকবে?


95

আমার কাছে একটি সি # উইনফর্মস অ্যাপ রয়েছে যা অন্য প্রোগ্রামে ম্যাক্রো চালায়। অন্যান্য প্রোগ্রাম ক্রমাগত উইন্ডো পপ আপ করবে এবং সাধারণত জিনিসগুলিকে আরও ভাল শব্দের অভাবে পাগল করে তুলবে। আমি একটি বাতিল বোতামটি প্রয়োগ করতে চাই যা প্রক্রিয়াটি চালানো থেকে বিরত রাখবে, তবে উইন্ডোটি শীর্ষে রাখার মতো মনে হচ্ছে না। আমি সি # তে এটি কীভাবে করব?

সম্পাদনা: আমি টপমস্ট = সত্য চেষ্টা করেছি; , তবে অন্যান্য প্রোগ্রামটি তার নিজস্ব উইন্ডোগুলি উপরে উপরে পপ করে রাখে। আমার উইন্ডোটি প্রতি এন মিলিসেকেন্ডে শীর্ষে পাঠানোর কোনও উপায় আছে?

সম্পাদনা করুন: আমি এটি সমাধান করার উপায়টি ছিল এমন একটি সিস্টেম ট্রে আইকন যুক্ত করে যা এতে ডাবল-ক্লিক করে প্রক্রিয়াটি বাতিল করে দেয়। সিস্টেম ট্রে আইকনটি কভার হয়ে যায় না। যারা প্রতিক্রিয়া জানিয়েছেন তাদের সবাইকে ধন্যবাদ। আমি কেন 'সুপার-অন-টপ' উইন্ডো নেই সে সম্পর্কে নিবন্ধটি পড়েছি ... এটি যৌক্তিকভাবে কার্যকর হয় না।


63
হ্যাঁ, প্রতি কয়েক মিলি সেকেন্ডের জন্য একটি টাইমার সেট করুন যা আপনার ফর্ম.টপমস্টকে সত্য হিসাবে সেট করবে। তারপরে, কেবল এটি আকর্ষণীয় করে তুলতে, "ক্রেজি" প্রোগ্রামটি লোড হয়ে গেলে মর্টাল কোম্ব্যাট থেকে "অদ্বিতীয়!" অডিও ক্লিপটি প্লে করুন! :
পি

4
আপনার মন্তব্যটি হাসিখুশি মনে হতে পারে, আপনি ভেবেছিলেন আপনি খারাপ অভ্যাসটিকে উপহাস করতে পারেন। আমার সমস্যাটি একটি প্রসঙ্গ মেনু তৈরি করছিল যা ফ্লোলেআউটপ্যানেল সহ কোনও ফর্মের উপরে ভাসমান। যদি আপনি এটিকে অ্যাক্টিভেট () পদ্ধতি বলে থাকেন তবে একটি ফ্লোলেআউটপ্যানেল কেবল স্ক্রোল করা যাবে, ফোকাস () নির্দিষ্ট পরিস্থিতিতে যথেষ্ট নয়। আপনি কেবল এটি স্ক্রোল করতে সক্ষম হবেন না। এটি প্রসঙ্গত থেকে ফোকাস চুরি করে এমনকি যদি এর একচেটিয়া শীর্ষস্থানীয় = সত্য থাকে! যেহেতু কোনও বুদ্ধিমান ব্যক্তি জানেন যে আপনার উইনফর্ম অ্যাপ্লিকেশনগুলি এমটিথ্রেড মোডে চালিত হতে দেয় এবং প্রতিটি রূপকে নিজস্ব থ্রেড দেয় যা সমাধানটি সহজ করে তোলে:
ট্রুবেনফুচস

4
শয়তান, শয়তান: পেস্টবিন.com / এসএমজেএক্স ০ ইয়াভ ঝাঁকুনি ছাড়াই নির্দোষভাবে কাজ করে এবং ঘুম (১) এটিকে গুরুতর পারফরম্যান্স থেকে বিরত রাখতে যথেষ্ট। তিনি প্রসঙ্গ মেনুতে ফোকাস করার সময় কে তার টাস্ক ম্যানেজারে খোঁজ রাখেন? কনটেক্সট মেনুটি বন্ধ হয়ে গেলে আশা করা যায় যে খালি ব্যতিক্রম হ্যান্ডলারটিতে চলে আসে এবং মারা যায়। আপনি যদিও ইজ ডিসপোজড ব্রেক এ বিল্ড করতে পারেন।
ট্রুবেনফুচস

: আমি শুধু এখানে এই সমস্যার আমার সমাধান পোস্ট stackoverflow.com/questions/2546566/...
kfn

ক্রাউড থ্রেড অপারেশন ব্যতিক্রমের কারণে এটি ট্রুবেনফুচগুলি ব্যর্থ হবে। এটি কাজ করা উচিত।
mekb

উত্তর:


172

Form.TopMost অন্য প্রোগ্রামটি শীর্ষতম উইন্ডো তৈরি না করে কাজ করবে।

উইন্ডো তৈরির কোনও উপায় নেই যা অন্য কোনও প্রক্রিয়ার নতুন শীর্ষতম উইন্ডো দ্বারা আচ্ছাদিত নয়। রেমন্ড চেন কেন তা ব্যাখ্যা করলেন।


11
যদি অন্য কোনও সম্পূর্ণ নবজাতক এটি 2016 এবং এর বাইরে দেখতে পান তবে চেষ্টা করুনForm.ActiveForm.TopMost
ডেভিলের অ্যাডভোকেট

4
@ স্কটবিসন: এটি ভাল। এই প্রযুক্তিগত গতিশীল বিশ্বে আপডেট হওয়া তথ্যগুলি অত্যন্ত প্রয়োজনীয়। ধন্যবাদ :)।
সন্দীপ কুশওয়াহ

49

আমি আমার উইনফর্মস অ্যাপ্লিকেশনটিকে "সর্বদা শীর্ষে" তৈরি করতে সন্ধান করছিলাম কিন্তু "টপমস্ট" সেট করা আমার পক্ষে কিছুই করেনি। আমি জানতাম এটি সম্ভব ছিল কারণ উইনএম্প এটি করে (অন্যান্য অ্যাপ্লিকেশনগুলির হোস্ট সহ)।

আমি যা করেছি তা হ'ল "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);

তারপরে আপনার কোডে (আমি ফর্ম_ল্ড () এ কল যুক্ত করেছি, কলটি যুক্ত করুন:

SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);

আশা করি এইটি কাজ করবে. রেফারেন্স


4
এটি কেবল উইনফর্মস অ্যাপ্লিকেশনগুলিতেই নয়, কনসোল উইন্ডোতেও কাজ করে । ভাল লাগছে!
রোজ

ভাল, এই কাজ নিশ্চিত করতে পারেন। তবে কীভাবে আমি এটিকে পরিবর্তন করতে সক্ষম হব যাতে শীর্ষস্থানীয় না হয়? আপনি কি ভাগ করতে পারেন এমন কোনও HWND_BOTTOMMOST পতাকা রয়েছে?
চিহ্নিত করুন

ভাল প্রশ্ন, আপনি যদি এই সর্বোচ্চ-সক্ষমতা এবং ডিফল্ট আচরণের মধ্যে পরিবর্তন করতে চান (উদাহরণস্বরূপ, উইন্ডো আচরণের জন্য আপনার "সর্বদা শীর্ষে" চেকবক্স রয়েছে)। আমি অনুমান করতে পারি যে সম্ভবত সঠিক পতাকা দিয়ে এটি সম্ভব হবে। যদি আপনার কাছে সঠিক পতাকা থাকে যা ডিফল্ট উইন্ডো আচরণের বর্ণনা দেয় (বলুন SWP_DEFAULT = 0x0003), তবে আপনি কেবল এই পতাকাগুলি দিয়ে আবার "সেট উইন্ডোপোস ()" কল করতে পারেন। আমি ঠিক নিশ্চিত নই; আমি এটি তাকান না। শুভকামনা যদি আপনি করেন, এবং কেউ যদি এটি এখানে যোগ করুন!
ক্ল্যামাম

এটি যথারীতি ফুল স্ক্রিন গেম মোডে কাজ করছে না
সজিতা রথনায়েক

4
@ মার্ক হ্যাঁ, এখানে একটি পতাকা রয়েছে HWND_NOTOPMOST (= -2)। ডকস.মাইক্রোসফট.ইন- ইউস
কেভিন ভুইলিউমিয়ার

23

যদি "পাগল হয়ে যাওয়া" দ্বারা আপনি বোঝাচ্ছেন যে প্রতিটি উইন্ডো অন্যের থেকে ফোকাস চুরি করে রাখে, টপমস্ট সমস্যার সমাধান করবে না।

পরিবর্তে, চেষ্টা করুন:

CalledForm.Owner = CallerForm;
CalledForm.Show();

এটি 'সন্তানের' ফর্মটি ফোকাস চুরি না করে প্রদর্শন করবে। সন্তানের রূপটি পিতামাতার সক্রিয় বা মনোনিবেশ করা থাকলেও তার পিতামাতার উপরে থাকবে। এই কোডটি কেবল সহজেই কাজ করে যদি আপনি মালিকের ফর্মের মধ্যে থেকে শিশু ফর্মের কোনও উদাহরণ তৈরি করেন। অন্যথায়, আপনাকে API ব্যবহার করে মালিক সেট করতে হতে পারে।


4
আপনাকে অনেক ধন্যবাদ আমি এটি সঠিকভাবে ব্যবহার করেছি এবং এটি পুরোপুরি কাজ করেছে!
এভেটিসজি

4
ধন্যবাদ .. ঠিক আমি যা খুঁজছিলাম
সামিরা কুমারসিংহ

CalledForm.Ownerনিজেকে ( CalledForm) এ সেট করার ফলে একটি System.ArgumentException: 'একটি বিজ্ঞপ্তি নিয়ন্ত্রণ রেফারেন্স তৈরি করা হয়েছে। একটি নিয়ন্ত্রণ নিজের মালিকানাধীন বা প্যারেন্টেড হতে পারে না ''
মেকবি

4
কেন তুমি CalledForm পরিবর্তে CallerForm ব্যবহার কোনটি :)
Jesper

16

ফর্ম.টপমস্ট সেট করুন


আমি চেষ্টা করেছিলাম, এই ... আমার কি নিয়মিত এটি করা দরকার? 'ক্রেজি প্রোগ্রাম' অবিলম্বে গ্রহণ করে ...
jle

4
না - আপনি যদি আপনার ফর্ম সেট করেন। টপমস্ট = সত্য, এটি কাজ করা উচিত। "ক্রেজি" প্রোগ্রামটির অবশ্যই এটির ডায়লগগুলি অবশ্যই টপমোস্টে সেট করা থাকতে পারে, সেক্ষেত্রে আপনি এটিকে ওভাররাইড করতে পারবেন না।
রিড কোপসি

সুষ্ঠু লড়াই নয়। ধন্যবাদ.
jle

11

আমার কাছে একটি ক্ষণস্থায়ী 5 মিনিটের ব্যবধান ছিল এবং আমি ফর্মটি সম্পূর্ণরূপে নির্দিষ্ট করতে ভুলে গিয়েছিলাম:

  myformName.ActiveForm.TopMost = true;

তবে আমি যা চেয়েছিলাম তা এই ছিল!

  this.TopMost = true;

আমার জন্য নিখুঁত কাজ করেছেন। if (checkBox1.Checked == সত্য) {this.TopMost = true; } অন্য {this.TopMost = মিথ্যা; }
যোশু

6

ফর্মটির .TopMostসম্পত্তি সত্য হিসাবে সেট করুন ।

আপনি সম্ভবত এটি সর্বদা এভাবে ছেড়ে যেতে চান না: আপনার বাহ্যিক প্রক্রিয়া শুরু হওয়ার পরে এটি সেট করুন এবং এটি শেষ হয়ে গেলে এটি আবার রেখে দিন।


5

আমি এটি সমাধান করার উপায়টি ছিল এমন একটি ট্রে ট্রে আইকন যা একটি বাতিল বিকল্প ছিল।


5

নিম্নলিখিত কোডটি উইন্ডোটিকে সর্বদা শীর্ষে রাখার পাশাপাশি ফ্রেমহীন করে তোলে।

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace StayOnTop
{
    public partial class Form1 : Form
    {
        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;

        [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);

        public Form1()
        {
            InitializeComponent();
            FormBorderStyle = FormBorderStyle.None;
            TopMost = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetWindowPos(this.Handle, HWND_TOPMOST, 100, 100, 300, 300, TOPMOST_FLAGS);
        }

        protected override void WndProc(ref Message m)
        {
            const int RESIZE_HANDLE_SIZE = 10;

            switch (m.Msg)
            {
                case 0x0084/*NCHITTEST*/ :
                    base.WndProc(ref m);

                    if ((int)m.Result == 0x01/*HTCLIENT*/)
                    {
                        Point screenPoint = new Point(m.LParam.ToInt32());
                        Point clientPoint = this.PointToClient(screenPoint);
                        if (clientPoint.Y <= RESIZE_HANDLE_SIZE)
                        {
                            if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                                m.Result = (IntPtr)13/*HTTOPLEFT*/ ;
                            else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                                m.Result = (IntPtr)12/*HTTOP*/ ;
                            else
                                m.Result = (IntPtr)14/*HTTOPRIGHT*/ ;
                        }
                        else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE))
                        {
                            if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                                m.Result = (IntPtr)10/*HTLEFT*/ ;
                            else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                                m.Result = (IntPtr)2/*HTCAPTION*/ ;
                            else
                                m.Result = (IntPtr)11/*HTRIGHT*/ ;
                        }
                        else
                        {
                            if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                                m.Result = (IntPtr)16/*HTBOTTOMLEFT*/ ;
                            else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                                m.Result = (IntPtr)15/*HTBOTTOM*/ ;
                            else
                                m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ;
                        }
                    }
                    return;
            }
            base.WndProc(ref m);
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.Style |= 0x20000; // <--- use 0x20000
                return cp;
            }
        }
    }
}

আলেকজানের সাথে সম্মত হন - আপনার প্রোগ্রামটি শীর্ষস্থানীয় করে তোলে? দেখে মনে হচ্ছে এটি আসলে কেবলমাত্র "শীর্ষস্থানীয় = সত্য" বিবৃতি, যা অনেক ক্ষেত্রেই কাজ করে না। কোডের বাকী সমস্ত অংশই সত্যিই সমস্যার উত্তর দেয় না।
ফাহাব

4

আপনি যে অ্যাপ্লিকেশনটির দৃশ্যমানতা দমন করতে চেষ্টা করছেন তা কী? আপনি কি আপনার পছন্দসই প্রভাব অর্জনের অন্যান্য উপায়গুলি অনুসন্ধান করেছেন? আপনি বর্ণনা করার মতো আপনার ব্যবহারকারীদেরকে এইরকম দুর্বৃত্ত আচরণের শর্তযুক্ত করার আগে দয়া করে এটি করুন: আপনি কিছু শব্দ করার পরিবর্তে কিছু দুষ্টু সাইট ব্রাউজার উইন্ডোজের সাথে কী করেন তার মতো ...

কমপক্ষে অন্তত বিস্ময়ের নিয়মটি মেনে চলার চেষ্টা করুন । ব্যবহারকারীরা নিজেরাই বেশিরভাগ অ্যাপ্লিকেশনগুলির জেড-অর্ডার নির্ধারণ করতে সক্ষম হতে পারে বলে আশাবাদী। আপনি জানেন না যে তাদের কাছে সবচেয়ে গুরুত্বপূর্ণ কী, তাই আপনি যদি কিছু পরিবর্তন করেন তবে আপনার নিজের প্রচারের পরিবর্তে অন্য অ্যাপ্লিকেশনটিকে সমস্ত কিছুর পিছনে ঠেলে ফোকাস করা উচিত।

এটি অবশ্যই কৌশলযুক্ত, যেহেতু উইন্ডোজের বিশেষত পরিশীলিত উইন্ডো ম্যানেজার নেই। দুটি পদ্ধতির নিজেদেরকে পরামর্শ দেয়:

  1. টপ লেভেল উইন্ডোজ enumerating এবং পরীক্ষণ যা প্রক্রিয়া তারা অন্তর্গত , যদি তাই হয় তাদের z- র-অর্ডার ড্রপ । (এই WinAPI ফাংশনগুলির জন্য কাঠামোর পদ্ধতি আছে কিনা তা আমি নিশ্চিত নই।)
  2. এটি ডেস্কটপে অ্যাক্সেস করা থেকে রোধ করার জন্য শিশু প্রক্রিয়া অনুমোদনের সাথে ফিডিং ... তবে আমি এটিকে চেষ্টা করব না যতক্ষণ না অন্য পদ্ধতিটি ব্যর্থ হয়, কারণ ব্যবহারকারীর মিথস্ক্রিয়ানের প্রয়োজনে শিশু প্রক্রিয়াটি জম্বি অবস্থায় শেষ হতে পারে।

4

আপনার ফর্মটিকে কেন একটি সংলাপ বাক্স তৈরি করছেন না:

myForm.ShowDialog();

4
হ্যাঁ! এই আমি চেয়েছিলাম। TopMost = trueক্রোম সহ সবকিছুর উপরে আমার ফর্মটি সেট করা জোর করে, যখন এটি বাস্তবতা হয় যে এটি কেবল একটি সেটিংস বাক্স এবং মূল ফর্মের উপরে আমার এটির দরকার ছিল। আপনি ইন্টারনেট ব্যক্তি।
MDMoore313

3

এখানে সেটফোরগ্রাউন্ড উইন্ডো সমতুল্য:

form.Activate();

আমি লোককে অদ্ভুত কাজ করতে দেখেছি:

this.TopMost = true;
this.Focus();
this.BringToFront();
this.TopMost = false;

http://blog.jorgearimany.com/2010/10/win32-setfiregroundwindow-equivalent-in.html


আমি যদি আমার উইন্ডোটি সক্রিয় না করতে চাই, তবে আমি কেবল এটি শীর্ষস্থানীয় (তথ্যমূলক, ইন্টারেক্টিভ নয়) চাই? আমি কেবলমাত্র জিজ্ঞাসা করি কারণ আসলে "শীর্ষস্থানীয় = সত্য" জারি করা আমার ক্ষেত্রে কাজ করছে না (এটি সিস্টেমে কাজ করে, অন্যের উপর নয়)।
ফাহাব

এটি আমাদের জন্য কাজ করার জন্য this.Show(); this.Activate(); this.BringToFront(); পেয়েছে : কিন্তু এই উত্তরটি আমাদের সেই সমাধানে পেয়েছে। ধন্যবাদ!

1

আমি জানি এটি পুরানো, তবে আমি এই প্রতিক্রিয়াটি দেখিনি।

উইন্ডোতে (এক্সএএমএল) যুক্ত করুন:

Deactivated="Window_Deactivated"

উইন্ডো_সক্রিয়াকরণের জন্য পিছনে কোডে:

private void Window_Deactivated(object sender, EventArgs e)
    {
        Window window = (Window)sender;
        window.Activate();
    }

এটি আপনার উইন্ডোটিকে উপরে রাখবে।


4
আপনি এই প্রতিক্রিয়াটি দেখেন নি কারণ প্রশ্নটি উইনফর্মের বিষয়ে।
গতিময়

0

উপর ভিত্তি করে clamum এর উত্তর, এবং কেভিন Vuilleumier এর অন্যান্য পতাকা আচরণের জন্য দায়ী সম্পর্কে মন্তব্য, আমি এই টগল যে মধ্যে স্যুইচ করতে প্রণীত উপর টপ এবং না হয়ে টপ একটি বাটন প্রেস করেন।

private void button1_Click(object sender, EventArgs e)
    {
        if (on)
        {
            button1.Text = "yes on top";
            IntPtr HwndTopmost = new IntPtr(-1);
            SetWindowPos(this.Handle, HwndTopmost, 0, 0, 0, 0, TopmostFlags);
            on = false;
        }
        else
        {
            button1.Text = "not on top";
            IntPtr HwndTopmost = new IntPtr(-2);
            SetWindowPos(this.Handle, HwndTopmost, 0, 0, 0, 0, TopmostFlags);
            on = true;
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.