[VB] Combobox bringtofront

04/25/2014 16:11 silvermf1991#1
Hi,

ich hab eine Combobox erstellt die mir einen bestimmten Prozess ausliest und listet > funktioniert wunderbar

Nun ist mein Problem, ich würde gern "bringtofront" also, diesen Prozess "als erstes" auf meinen Desktop hocheben, wenn man das so sagen kann


Ich habe gedacht, dürfte ja gehen wenn ich

Code:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ComboBox1.SelectedItem.show()
    End Sub
oder ".ComboBox1.SelectedItem.bringtofront()" benutze, pustekuchen

Es kommt nur eine Fehlermeldung

[Only registered and activated users can see links. Click Here To Register...]

Da ich leider noch nicht so erfahren in Umgang mit VB bin, bitte ich um Nachsicht und auf eine gute Hilfe :handsdown:
04/25/2014 17:50 tolio#2
hwnd handle auslesen
pinvoke [Only registered and activated users can see links. Click Here To Register...] machen
fertig
04/25/2014 18:20 silvermf1991#3
Quote:
Originally Posted by tolio View Post
hwnd handle auslesen
pinvoke [Only registered and activated users can see links. Click Here To Register...] machen
fertig
Sachte sachte :o

Was ist HWND und wie les ich das aus?

Zu pinvoke: Ich hab das VB genommen, hoffe das war richtig weil andere "Codingsprache" die da sind kenn ich absolut garnicht

Code:
Public Declare Function BringWindowToTop Lib "user32" (ByVal HWnd As IntPtr) As Boolean
04/25/2014 18:41 Mostey#4
Quote:
Originally Posted by silvermf1991 View Post
Was ist HWND und wie les ich das aus?
Ein Handle zu einem Fenster. Also etwas, was dieses Fenster eindeutig identifiziert. Meistens gibt's da Funktionen die das auslesen können. Ansonsten hast du doch sicher eine Process Instanz die du für das Programm nutzt, oder? Da gibt's ne Eigenschaft MainWindowHandle, wie wär's damit?
04/25/2014 18:56 silvermf1991#5
Quote:
Originally Posted by Mostey;28020284Ansonsten hast du doch sicher eine [I
Process[/I] Instanz die du für das Programm nutzt, oder? Da gibt's ne Eigenschaft MainWindowHandle, wie wär's damit?
Leider kann ich mit "Prozessinstanz" nichts anfangen :( hab darüber echt kein Plan was du nun damit meinst

*gleich schon schläge erwarte*


Code:
Public Class Form1

    Public Declare Function BringWindowToTop Lib "user32" (ByVal HWnd As IntPtr) As Boolean
    Public ReadOnly Property MainWindowHandle As IntPtr
        Get

        End Get
    End Property
So stehts nun am Anfang bei mir

Ich finds komisch das ich ohne große Mühe den Prozess/e Id's + Name raussuchen und filtern konnte, aber nun hier so verkacke

Ich hoffe ihr habt mit mir Geduld :rolleyes:
04/25/2014 19:07 Mostey#6
Quote:
Originally Posted by silvermf1991 View Post
Leider kann ich mit "Prozessinstanz" nichts anfangen :( hab darüber echt kein Plan was du nun damit meinst
OK, wie öffnest du den anderen Prozess denn? Oder wie findest du ihn? Poste mal deinen Code dazu.

Quote:
Originally Posted by silvermf1991 View Post
Code:
Public Class Form1

    Public Declare Function BringWindowToTop Lib "user32" (ByVal HWnd As IntPtr) As Boolean
    Public ReadOnly Property MainWindowHandle As IntPtr
        Get

        End Get
    End Property
Mit Process Instanz war eine Instanz der Klasse Process gemeint, keine Eigenschaft in deiner Form. :rolleyes:


Quote:
Originally Posted by silvermf1991 View Post
Ich hoffe ihr habt mit mir Geduld :rolleyes:
So lange du dich bemühst, sollte das kein Problem sein. :rolleyes:
04/25/2014 20:25 silvermf1991#7
Quote:
Originally Posted by Mostey View Post
OK, wie öffnest du den anderen Prozess denn? Oder wie findest du ihn? Poste mal deinen Code dazu.
Code:
        Dim pList() As System.Diagnostics.Process =
        System.Diagnostics.Process.GetProcessesByName("prozessname")
        For Each proc As System.Diagnostics.Process In pList
            ComboBox1.Items.Add(proc.ProcessName & proc.Id)
        Next
Da muss ich noch mit Asc nen Leerzeichen / Doppelpunkt einfügen, aber solange geht es noch, ist ja nurn schönheitsfehler


Quote:
Originally Posted by Mostey View Post
So lange du dich bemühst, sollte das kein Problem sein. :rolleyes:
:handsdown: Möge mich meine Bemühung auch dann belohnen :cool:
04/25/2014 20:29 Mostey#8
Quote:
Originally Posted by silvermf1991 View Post
Code:
        Dim pList() As System.Diagnostics.Process =
        System.Diagnostics.Process.GetProcessesByName("prozessname")
        For Each proc As System.Diagnostics.Process In pList
            ComboBox1.Items.Add(proc.ProcessName & proc.Id)
        Next
Da muss ich noch mit Asc nen Leerzeichen / Doppelpunkt einfügen, aber solange geht es noch, ist ja nurn schönheitsfehler
[Only registered and activated users can see links. Click Here To Register...]

Damit hast du dein Handle. SetForegroundWindow oder etwas ähnliches und dann dürfte das passen.
04/25/2014 20:53 silvermf1991#9
Quote:
Originally Posted by Mostey View Post
Damit hast du dein Handle. SetForegroundWindow oder etwas ähnliches und dann dürfte das passen.
Ok.. Jetzt scheißt das Programm wenigstens nicht ab, wenn ich den Button zum "hervorheben" klicke! :D

Nur leider, hebt der das Fenster immernoch nicht nach oben

Hab ich gerade nen denkfehler oder hab ich was übersehen? :confused:

Code:
Public Class Form1

    Dim SetForegroundWindow As Object
    Public ReadOnly Property MainWindowHandle As IntPtr
        Get

        End Get
    End Property
Code:
    Private Sub ComboBox1_Click(sender As Object, e As EventArgs) Handles ComboBox1.Click
        ComboBox1.Items.Clear()
        Dim pList() As System.Diagnostics.Process =
        System.Diagnostics.Process.GetProcessesByName("prozessname")
        For Each proc As System.Diagnostics.Process In pList
            ComboBox1.Items.Add(proc.ProcessName & Asc(0) & proc.Id)
        Next
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SetForegroundWindow = ComboBox1.SelectedItem
    End Sub
04/25/2014 21:23 Mostey#10
SetForegroundWindow() ist eine Funktion aus der user32.dll, kein Objekt.

Quote:
Note that MainWindowHandle returns 0 if the main window is hidden...
[Only registered and activated users can see links. Click Here To Register...]

Da würde mir spontan noch die FindWindow() Funktion aus der WinAPI einfallen.

Quote:
If you don't mind using the Windows API, you could use EnumWindowsProc, and check each of the handles that that turns up using GetWindowThreadProcessId (to see that it's in your process), and then maybe IsWindowVisible, GetWindowCaption and GetWindowTextLength to determine which hWnd in your process is the one you want.

Though if you haven't used those functions before that approach will be a right pain, so hopefully there's a simpler way.
[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...] scheint da eine gute Möglichkeit, um nicht alle Funktionen selber noch einmal einbinden zu müssen. Hat tolio aber auch schon genannt. Ergänzend dazu musst du das Fenster erstmal finden.
04/25/2014 22:06 silvermf1991#11
Ok nun bin ich ganz draussen >_<

Die Links sind aber fast nur C++ / C#, ich basiere doch eher auf vb.net, oder?

Hier was bei mir nun ist, ich kapiere jedenfalls nur, das es gerade nicht klappt

Code:
    Dim nWnd As IntPtr
    Dim ceroIntPtr As New IntPtr(0)
    Dim Wnd_name As String

    Private Property FindWindow(p1 As Object, Wnd_name As String) As IntPtr
        Get
            Return _findWindow
        End Get
        Set(value As IntPtr)
            _findWindow = value
        End Set
    End Property
Code:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Wnd_name = "firefox.exe"
        nWnd = FindWindow(Nothing, Wnd_name)
        'show the info
        If nWnd.Equals(ceroIntPtr) Then
            MsgBox("Fenster läuft nicht")
        Else
            MsgBox("Fenster läuft")
        End If
    End Sub
Aber beim "klicken" kommt immer nur "Nicht gefunden"
04/25/2014 22:40 Mostey#12
Quote:
Originally Posted by silvermf1991 View Post
Ok nun bin ich ganz draussen >_<

Die Links sind aber fast nur C++ / C#, ich basiere doch eher auf vb.net, oder?
Die Links haben mit den Programmiersprachen eher wenig zutun. Fokus liegt hier eher auf der WinAPI die sowohl von C++, von C# als auch von VB.NET genutzt wird. In C++ wirst du nur häufiger von den Funktionen Gebrauch machen müssen, weil es dort nicht für alles einen Wrapper gibt, wie es in den .NET Sprachen meist der Fall ist.

C# kann man übrigens ohne Probleme in VB.NET übersetzen, geht auch umgekehrt.

Ich hab schon vermutet das du da nicht so richtig hinterherkommst, allerdings weiß ich wirklich nicht, wie ich dir das anders vermitteln soll. Dazu müsstest du auch erstmal wissen, was die WinAPI ist, wieso sie existiert und wie sie in Programmiersprachen wie VB.NET genutzt wird.

Hier sieht man auch noch einmal gut die Abhängigkeiten, wenn auch nicht auf dem aktuellen Stand:

[Only registered and activated users can see links. Click Here To Register...]

Kernel, Treiber und Dienste fehlen hier zwar auch, macht aber nichts.

Du kannst die Funktionen aus der dazugehörigen DLL importieren. (Welche das ist, steht in MSDN auf der jeweiligen Seite der Funktion)

Sieht ungefähr so aus:
Code:
[DllImport("user32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lp1, string lp2);
Heißt also, hier wird die Funktion FindWindow() aus der user32.dll importiert, damit dein Programm diese nutzen kann.


Quote:
Originally Posted by silvermf1991 View Post
Hier was bei mir nun ist, ich kapiere jedenfalls nur, das es gerade nicht klappt

Code:
    Dim nWnd As IntPtr
    Dim ceroIntPtr As New IntPtr(0)
    Dim Wnd_name As String

    Private Property FindWindow(p1 As Object, Wnd_name As String) As IntPtr
        Get
            Return _findWindow
        End Get
        Set(value As IntPtr)
            _findWindow = value
        End Set
    End Property
Code:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Wnd_name = "firefox.exe"
        nWnd = FindWindow(Nothing, Wnd_name)
        'show the info
        If nWnd.Equals(ceroIntPtr) Then
            MsgBox("Fenster läuft nicht")
        Else
            MsgBox("Fenster läuft")
        End If
    End Sub
Aber beim "klicken" kommt immer nur "Nicht gefunden"
Dein Code ist auch unvollständig, _findWindow sehe ich nicht und den Import von FindWindow auch nicht.
04/26/2014 01:28 silvermf1991#13
Quote:
Originally Posted by Mostey View Post
Fokus liegt hier eher auf der WinAPI die sowohl von C++, von C# als auch von VB.NET genutzt wird. In C++ wirst du nur häufiger von den Funktionen Gebrauch machen müssen, weil es dort nicht für alles einen Wrapper gibt, wie es in den .NET Sprachen meist der Fall ist.

C# kann man übrigens ohne Probleme in VB.NET übersetzen, geht auch umgekehrt.

Hab gerade gesehen, ich kann ja das Projekt neu machen, aber direkt auf C# ( hab mir mal "neues Project" genau angeschaut, hab garnicht gesehen das man direkt auf C# umstellen kann :) )

Werd erstmal was ich nun hab, soweit ich kann, "umschreiben" bzw. neu schreiben, denke das wird dann einfacher sein

Quote:
Originally Posted by Mostey View Post
Ich hab schon vermutet das du da nicht so richtig hinterherkommst, allerdings weiß ich wirklich nicht, wie ich dir das anders vermitteln soll. Dazu müsstest du auch erstmal wissen, was die WinAPI ist, wieso sie existiert und wie sie in Programmiersprachen wie VB.NET genutzt wird.
Auf die schnelle würde ich sagen, Windows Programme basieren auf Framework, um ältere Programme / Windows Systeme mit neuen Programmen / System kompatibel sein können, sodass man mit einer Codesprache, sagen wir nun .Net4 ist von W2000 bis W7 bestens geeignet, sodass man nicht wie bei Mac / Windows / Linux alles anders coden muss, damit es funktioniert

Lieg ich so in etwa mit meiner Vermutung richtig? :s

Quote:
Originally Posted by Mostey View Post
Du kannst die Funktionen aus der dazugehörigen DLL importieren. (Welche das ist, steht in MSDN auf der jeweiligen Seite der Funktion)
Das machen wa wenn ich das Design soweit es geht in C# gebracht hab! :)
04/26/2014 13:29 Mostey#14
Quote:
Originally Posted by silvermf1991 View Post
Auf die schnelle würde ich sagen, Windows Programme basieren auf Framework, um ältere Programme / Windows Systeme mit neuen Programmen / System kompatibel sein können, sodass man mit einer Codesprache, sagen wir nun .Net4 ist von W2000 bis W7 bestens geeignet, sodass man nicht wie bei Mac / Windows / Linux alles anders coden muss, damit es funktioniert

Lieg ich so in etwa mit meiner Vermutung richtig? :s
Wenn du damit sagen willst, das du die WinAPI auch auf Unix, Linux und Mac nutzen kannst, um nicht portieren zu müssen, liegst du falsch. Wieso sollte es auch ne Windows API bei Linux geben?

Die WinAPI stellt halt die Schnittstelle zwischen OS und deinem Programm dar. Wenn es die nicht gäbe, könnte dein Programm über das Betriebssystem nichts machen und auf nichts zugreifen, was die Anzeige eines Fensters ja schon unmöglich macht, weil du deine Fenster ebenfalls beim OS anmelden musst.

Wie das so bei Linux läuft, kann ich dir nicht sagen. Hab' noch nie etwas auf Linux programmiert.
04/26/2014 13:43 silvermf1991#15
Quote:
Originally Posted by Mostey View Post
Wenn du damit sagen willst, das du die WinAPI auch auf Unix, Linux und Mac nutzen kannst, um nicht portieren zu müssen, liegst du falsch. Wieso sollte es auch ne Windows API bei Linux geben?

Die WinAPI stellt halt die Schnittstelle zwischen OS und deinem Programm dar.

Ich meinte es ja auch so :D

Man kann von, wie ich oben als beispiel schrieb, von Windows 2000 bis zu Windows 7 alles dank der Windows API, die vom Framework abhängt, überall benutzen, ausser bei Linux / Mac etc. da diese nen komplett andere "Codesprache" benötigen aber egal ich denke ich weiß was damit in etwa gemeint ist (:

und ich hab nun das Programm für C# umgeschrieben, nur das ich nun nichtmehr den Prozess auslesen kann, aber denke mit C# werd ich besser umgehen können, ich mag die Struktur eher als wie auf VB

Ich habe oben nun eingefügt: "using Tool_by_Devidra;", so sollte er doch für alle Formen ( wenn ich dies oben einfüge ) alle Klassen und co. benutzen die ich im Projekt erstelle?