En keksinyt parempaa otsikkoa, modet korjaa jos on tarvetta..
Eli oon tässä koittanut pähkäillä miten saan minkä tahansa ikkunan aina päällimäiseksi VB.NETillä. Googlella oon koittanut vastausta löytää mutta tuloksetta, tuntuu löytyvän vaan että miten saa VB formin pysymään päällimmäisenä..
Vähän seuraavantapaista ohjelmaa yritän luoda:
http://deskpins.en.softonic.com/
Mistä kannattais lähteä / vinkkejä? :\
Siis haluatko pystyä nostamaan softasi formin päällimmäiseksi, vai minkä tahansa ohjelman päällimmäiseksi windowsissa?
jos formista kyse, niin ensin WindowState normaaliksi ja tämän jälkeen Application.OpenForms["ForminNimi"].BringToFront();
jos kyse on ulkoisesta softasta, niin WinApilla joudut tekemään:
Private Declare Function ShowWindow Lib "user32" _ (ByVal hWnd As System.IntPtr, ByVal nCmdShow As Long) As Long
Private Const SW_RESTORE = 9
Dim procArray As System.Diagnostics.Process Dim proc As System.Diagnostics.Process procArray = System.Diagnostics.Process.GetProcessesByName("MyRunningProgram") If procArray.Length > 0 Then proc = procArray(0) ShowWindow(proc.MainWindowHandle, SW_RESTORE) End If
groovyb kirjoitti:
Siis haluatko pystyä nostamaan softasi formin päällimmäiseksi, vai minkä tahansa ohjelman päällimmäiseksi windowsissa?
jos kyse on ulkoisesta softasta, niin WinApilla joudut tekemään:
Dim procArray As System.Diagnostics.Process Dim proc As System.Diagnostics.Process procArray = System.Diagnostics.Process.GetProcessesByName("MyRunningProgram") If procArray.Length > 0 Then proc = procArray(0) ShowWindow(proc.MainWindowHandle, SW_RESTORE) End If
Okei. Joo, siis nimenomaan minkä tahansa 'ulkoisen' ohjelman. Ajattelinkin että sen joutuu winapilla tekemään. Nyt kun tuo on suhteellisen selvää, miten kannattais lähteä tekeen tollasta ns. nastaa. Että sen saa otettua tuolta tray-palkista ja kiinnitettyä johonkin ohjelmaan, niin että se ohjelmaa pysyy sitten kokoajan päällimmäisenä?
Jos et ymmärtänyt, niin katos tämä: https://www.youtube.com/watch?v=4sFrmcfSRuY ja kelaa n. ~45sek kohtaan.
Eli periaatteessa sen "nastan" täytyis lukea sen prosessin nimi mihin se on kiinnitetty, ja korvata tuo "MyRunningProgram"? Vai oonko ihan hukassa?
Edit: Ja tosiaan, se "nasta" täytyy saada siihen aktiiviseen/päällimäiseen ikkunaan kiinni. Siihen voi varmaan soveltaa tätä koodivinkkiä: https://www.ohjelmointiputka.net/koodivinkit/
Tosin se täytyy kääntää vb.netille..
Ikkunan saa pysymään päällimmäisenä antamalla SetWindowPos-funktiolle toiseksi parametriksi HWND_TOPMOST
. Viimeiselle uFlags
-parametrille kannattaa antaa lipuiksi SWP_NOMOVE|SWP_NOSIZE
, jotta ikkunaa ei siirretä tai sen kokoa muuteta.
Nastan piirtäminen ulkoisen ohjelman ikkunan päälle on hankalempi juttu. Yksi ratkaisu on käyttää kerroksellisia ikkunoita, kuten linkkaamassasi koodivinkissä.
Deffi kirjoitti:
Ikkunan saa pysymään päällimmäisenä antamalla SetWindowPos-funktiolle toiseksi parametriksi
HWND_TOPMOST
. ViimeiselleuFlags
-parametrille kannattaa antaa lipuiksiSWP_NOMOVE|SWP_NOSIZE
, jotta ikkunaa ei siirretä tai sen kokoa muuteta.Nastan piirtäminen ulkoisen ohjelman ikkunan päälle on hankalempi juttu. Yksi ratkaisu on käyttää kerroksellisia ikkunoita, kuten linkkaamassasi koodivinkissä.
Ookkei, mitenköhän tuo toimii käytännössä? Eli miten saan nuo määritettyä tietylle ikkunalle, jos esim. prosessin nimi kirjoitetaan tekstiboksiin?
voit myös hakea prosessia (tai listata käynnissäolevat prosessit) suoraan koodissasi, ja käyttää löytyneitä
Dim p As Process Dim p as ProcessIWantToBringFront ProcessIWantToBringFront = "Notepad" 'Tai vaikka ProcessIWantToFind = textBox1.Text For Each p In Process.GetProcesses if p.Name == ProcessIWantToBringFront Then ShowWindow(p.MainWindowHandle,SW_RESTORE) Next
groovyb kirjoitti:
voit myös hakea prosessia (tai listata käynnissäolevat prosessit) suoraan koodissasi, ja käyttää löytyneitä
Dim p As Process Dim p as ProcessIWantToBringFront ProcessIWantToBringFront = "Notepad" 'Tai vaikka ProcessIWantToFind = textBox1.Text For Each p In Process.GetProcesses if p.Name == ProcessIWantToBringFront Then ShowWindow(p.MainWindowHandle,SW_RESTORE) Next
Koitin aiemmin samantyylistä, enkä saanut toimimaan. En saanut tuotakaan toimimaan.
Koitin seuraavaa:
Dim p As Process Dim p As ProcessIWantToBringFront ProcessIWantToFind = TextBox1.Text If p.Name = ProcessIWantToBringFront Then For Each p In Process.GetProcesses ShowWindow(p.MainWindowHandle, SW_RESTORE) Next End If
ja tuo P:hän on määritelty jo ekassa rivissä, niin antaa erroria tuolle toiselle p:lle.
:S
no tuossa tuli typo mulle, pitäisi olla Dim ProcessIWantToBringFront as string. Sen siitä saa kun ei jaksa edes lukea mitä on kirjoittanut :D
Noh, ei toimi siltikään. :s
Erroria pukkaa:
ProcessIWantToFind, ShowWindow, SW_RESTORE ei määritelty.
Ja 'Name' is not a member of 'System.Diagnostics.Process'.
Mitäs sitten. :P
Moi Rox!
testaa oheista viritelmää
Imports System Imports System.Diagnostics Imports System.Runtime.InteropServices Public Partial Class MainForm <DllImport("user32.dll", SetLastError:=True)> _ Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, _ ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, _ ByVal Y As Integer, ByVal cx As Integer, _ ByVal cy As Integer, ByVal uFlags As UInt32) As Boolean End Function Private Shared ReadOnly HWND_TOPMOST As IntPtr = New IntPtr(-1) Public Sub New() Me.InitializeComponent() End Sub Sub MainFormLoad(sender As Object, e As EventArgs) GetProcessList Me.button1.Text = "Update process list" End Sub Sub Button1Click(sender As Object, e As EventArgs) GetProcessList End Sub Sub ComboBox1SelectedIndexChanged(sender As Object, e As EventArgs) If comboBox1.SelectedIndex > 0 Then Dim pfound As Boolean = False For Each p As Process In Process.GetProcessesByName(comboBox1.SelectedItem.ToString) On Error Resume Next AppActivate(p.Id) If Err.Number = 0 Then SetWindowPos(p.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, 3) pfound = True : Exit For Else Err.Clear End If Next If Not pfound Then GetProcessList : MsgBox("Process not found - List has been updated") End If End If End Sub Sub GetProcessList() comboBox1.Items.Clear comboBox1.Items.Add("") For Each p As Process In Process.GetProcesses If p.MainWindowTitle <> "" Then comboBox1.Items.Add(p.ProcessName) End If Next comboBox1.SelectedIndex = 0 End Sub End Class
ruudulle yksi nappi ja listbox
Public Class Form1 Private Const SW_RESTORE = 9 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim p As System.Diagnostics.Process For Each p In System.Diagnostics.Process.GetProcesses ListBox1.Items.Add(p.ProcessName) Next End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim ProcArray As Process() ProcArray = Process.GetProcessesByName(ListBox1.SelectedItem.ToString()) Dim Proc = ProcArray(0) Dim RetVal As Long = ShowWindow(Proc.MainWindowHandle, SW_RESTORE) End Sub Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As System.IntPtr, ByVal nCmdShow As Long) As Long End Class
Tjoo. Hyviä vastauksia, mutta. Neaun koodi näytti kaikki ikkunat, ja groovyn kaikki prosessit.. Kummallakaan en saanut mitään "ulkoista" ikkunaa päällimäiseksi. Oon kyllä ihan jumissa tämän kanssa, ei tunnu millään nyt saavan tuota toimimaan.
MORJENS Rox!
Tsekkaa ensin tämä ja mieti sitten lisää...
siis jos avaat vaikka notepadin, ja minimoit takaisin alas, käynnistät softan,valitset prosessilistasta notepadin ja klikkaat, niin kyllä se notepad sieltä ylösnousee.
Aihe on jo aika vanha, joten et voi enää vastata siihen.