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 Ifgroovyb 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)
Nextgroovyb 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 Ifja 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 Classruudulle 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 ClassTjoo. 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.