Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: .NET Mikä tahansa ikkuna aina päällimäiseksi

Sivun loppuun

Rox [12.06.2013 09:27:38]

#

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ä? :\

groovyb [12.06.2013 10:21:13]

#

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

Rox [12.06.2013 12:18:30]

#

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/24435-vb6-aktiivisen-ikkunan-päällä-istuva-maskotti ?

Tosin se täytyy kääntää vb.netille..

Deffi [12.06.2013 12:44:19]

#

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ä.

Rox [12.06.2013 12:58:05]

#

Deffi kirjoitti:

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ä.

Ookkei, mitenköhän tuo toimii käytännössä? Eli miten saan nuo määritettyä tietylle ikkunalle, jos esim. prosessin nimi kirjoitetaan tekstiboksiin?

groovyb [12.06.2013 13:09:37]

#

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

Rox [12.06.2013 13:33:24]

#

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

groovyb [12.06.2013 14:23:26]

#

no tuossa tuli typo mulle, pitäisi olla Dim ProcessIWantToBringFront as string. Sen siitä saa kun ei jaksa edes lukea mitä on kirjoittanut :D

Rox [12.06.2013 18:19:56]

#

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

neau33 [12.06.2013 20:56:03]

#

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

groovyb [12.06.2013 21:02:39]

#

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

Rox [13.06.2013 13:51:48]

#

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.

neau33 [13.06.2013 14:50:12]

#

MORJENS Rox!

Tsekkaa ensin tämä ja mieti sitten lisää...

groovyb [13.06.2013 15:28:45]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta