Tastendruck

Hallo!

Ich hab mal wieder zwei Frage:

Ich möchte ein Programm schreiben, das im Hintergrund läuft und auf Tastendruck vorher definierte Programme startet, z.B. Taste 7 startet den Internet Explorer.
Wenn ich das Formular auf visible=false setze sieht man es zwar unten in der Leiste nicht, aber im Taskmanager unter Anwendungen. Die erste Frage wäre es also, wie ich das unterbinden kann!

Die zweite Frage ist, wie bekomme ich es hin, dass die Tasten „global“, also zu jeder Zeit abgefragt werden?

Vielen Dank schon mal!
Rodario

Hallo

Ich hab mal wieder zwei Frage:

Ich möchte ein Programm schreiben, das im Hintergrund läuft
und auf Tastendruck vorher definierte Programme startet, z.B.
Taste 7 startet den Internet Explorer.
Wenn ich das Formular auf visible=false setze sieht man es
zwar unten in der Leiste nicht, aber im Taskmanager unter
Anwendungen. Die erste Frage wäre es also, wie ich das
unterbinden kann!

Formular ausblenden, mit der Methode Hide :smile:
Die Eigenschaft ShowinTaskbar auf False stellen
Die Eigenschaft TaskVisible der Application auf False setzen.

Smit sieht man das proggi nicht in der Taskbar. Desweiteren taucht es im Taskmanager nur noch unter Prozesse auf :smile:

Die zweite Frage ist, wie bekomme ich es hin, dass die Tasten
„global“, also zu jeder Zeit abgefragt werden?

die API GetAsyncKeyState ist für systemweite Tastaturabfragen geeignet.

Vielen Dank schon mal!
Rodario

MfG Alex

Hi Alex,

erst mal Danke!

Formular ausblenden, mit der Methode Hide :smile:

Klappt!

Die Eigenschaft ShowinTaskbar auf False stellen

Klappt!

Die Eigenschaft TaskVisible der Application auf False setzen.

Wo kann ich das umstellen?
In dem Eigenschaftenfenster von Projekt1 kann ich nur den Namen umstellen :frowning:
btw: Ich verwende Visual Basic 6.0

die API GetAsyncKeyState ist für systemweite Tastaturabfragen
geeignet.

Wenn es nicht zu viel verlangt ist, könntest du bitte ein kleines Beispiel schreiben?

MfG Rodario

Hallo,

erst mal Danke!

Nichts zu danken :smile:

Die Eigenschaft TaskVisible der Application auf False setzen.

Wo kann ich das umstellen?
In dem Eigenschaftenfenster von Projekt1 kann ich nur den
Namen umstellen :frowning:
btw: Ich verwende Visual Basic 6.0

Das musst du via Quelltext machen. Siehst du im Demo :smile:

Wenn es nicht zu viel verlangt ist, könntest du bitte ein
kleines Beispiel schreiben?

Jups, erstelle eine Form, lege darauf eine Timer ( Timer1) und folgenden Quelltext

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
 App.TaskVisible = False
 Timer1.Interval = 100
 Timer1.Enabled = True
End Sub

Private Function CompKey(KCode As Long, KText As String) As Boolean
Dim Result As Integer
 Result = GetAsyncKeyState(KCode)
 If Result = -32767 Then
 CompKey = True
 MsgBox Chr(KCode)
 Else
 CompKey = False
 End If
End Function

Private Sub Timer1\_Timer()
Dim X As Long
 For X = 48 To 90
 If CompKey(X, UCase(Chr$(X))) Then Exit Sub
 If CompKey(X + 48, UCase("NUM " & Chr$(X))) Then Exit Sub
 Next X
 If CompKey(8, "BACKSPACE") Then Exit Sub
 If CompKey(9, "TAB") Then Exit Sub
 If CompKey(13, "ENTER") Then Exit Sub
 If CompKey(16, "SHIFT") Then Exit Sub
 If CompKey(17, "STRG") Then Exit Sub
 If CompKey(18, "ALT") Then Exit Sub
 If CompKey(19, "PAUSE") Then Exit Sub
 If CompKey(27, "ESC") Then Exit Sub
 If CompKey(33, "PAGE UP") Then Exit Sub
 If CompKey(34, "PAGE DOWN") Then Exit Sub
 If CompKey(35, "ENDE") Then Exit Sub
 If CompKey(36, "POS1") Then Exit Sub
 If CompKey(37, "LEFT") Then Exit Sub
 If CompKey(38, "UP") Then Exit Sub
 If CompKey(39, "RIGHT") Then Exit Sub
 If CompKey(40, "DOWN") Then Exit Sub
 If CompKey(44, "DRUCK") Then Exit Sub
 If CompKey(45, "INSERT") Then Exit Sub
 If CompKey(46, "DEL") Then Exit Sub
 If CompKey(144, "NUM") Then Exit Sub
 If CompKey(145, "ROLLEN") Then Exit Sub
 For X = 112 To 127
 If CompKey(X, "F" & CStr(X - 111)) Then Exit Sub
 Next X
 ' usw... usw...
End Sub

Das sollte dir die Funktionsweise verdeutlichen :wink:
Sollte dir ein Intervall von 100 MS nicht reichen, so kannst du den Wert nochmals herabsetzen oder eine Do Loop Schleife. Aber dann dort das DoEvents dann nicht vergessen.

MfG Alex

Hi,

Es funktioniert, danke!!

Nochmal was anderes: Kennst du zufällig einen Quellcode, der eine Datei auf einen im Quellcode definierten FTP-Server hochlädt?
Der Pfad der Datei ist auch immer der selbe, also soll er auch im Quellcode angegeben sein :smile:

Hab bis jetzt nur Quellcodes mit vielen Extras gefunden und da steig ich nicht mehr ganz durch :smile:

MfG
Rodario

Hallo Rodario,

Es funktioniert, danke!!

Musst aber halt noch deinen Anforderungen entsprechend anpassen :wink:

Nochmal was anderes: Kennst du zufällig einen Quellcode, der
eine Datei auf einen im Quellcode definierten FTP-Server
hochlädt?

Nichts leichter als das :wink:

Option Explicit

Option Explicit
 
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal nAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal nFlags As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal nService As Long, ByVal nFlags As Long, ByVal nContext As Long) As Long
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
 
Private Const INTERNET\_OPEN\_TYPE\_PRECONFIG = 0
Private Const INTERNET\_INVALID\_PORT\_NUMBER = 0
Private Const INTERNET\_SERVICE\_FTP = 1
 
Public Enum eTransferType
 FTP\_TRANSFER\_TYPE\_BINARY = &H2
 FTP\_TRANSFER\_TYPE\_ASCII = &H1
End Enum
 
Private hOpen As Long
Private hConnection As Long


' Verbindung zum Server herstellen
Private Function Connect(ByVal sRemoteHost As String, Optional ByVal sUsername As String = "anonymous", Optional ByVal sPassword As String = "guest") As Boolean
 If hOpen 0 Or hConnection 0 Then Disconnect
 hOpen = InternetOpen("FTP", INTERNET\_OPEN\_TYPE\_PRECONFIG, vbNullString, vbNullString, 0)
 If hOpen Then hConnection = InternetConnect(hOpen, sRemoteHost, INTERNET\_INVALID\_PORT\_NUMBER, sUsername, sPassword, INTERNET\_SERVICE\_FTP, 0, 0)
 Connect = (hConnection 0)
End Function

' Datei auf den Server hochladen
Private Function FileUpload(ByVal sLocalFilename As String, ByVal sRemoteFilename As String, Optional ByVal nTransferType As eTransferType = FTP\_TRANSFER\_TYPE\_BINARY) As Boolean
 FileUpload = FtpPutFile(hConnection, \_
 sLocalFilename, sRemoteFilename, nTransferType, 0)
End Function

' Verbindung zum Server beenden
Private Sub Disconnect()
 If hConnection 0 Then
 InternetCloseHandle hConnection
 hConnection = 0
 End If
 If hOpen 0 Then
 InternetCloseHandle hOpen
 hOpen = 0
 End If
End Sub


Private Sub testUpload()
 Dim sRemoteHost As String
 Dim sLocalFile As String
 Dim sRemoteFile As String
 Dim nTransferMode As eTransferType
 Dim bResult As Boolean
 sRemoteHost = "Der-Server.de" 'Server wo der Upload stattfinden soll
 If Connect(sRemoteHost) Then
 sLocalFile = App.Path & "\DeinFile.de" 'Datei die hochgeladen werden soll
 sRemoteFile = "/download/help/myHelp.txt" 'Pfad + Filename wo die Datei abgelegt werden soll
 nTransferMode = FTP\_TRANSFER\_TYPE\_ASCII ' In welchen Modus übertragen wir die Datei
 bResult = FileUpload(sLocalFile, sRemoteFile, nTransferMode) 'Wir machen den Upload
 If bResult Then
 MsgBox "Upload erfolgreich!"
 Else
 MsgBox "Fehler beim Upload der Datei!"
 End If
 Call Disconnect 'Wir trennen die Verbindung zum Server
End If
End Sub

Der Pfad der Datei ist auch immer der selbe, also soll er auch
im Quellcode angegeben sein :smile:

Ob du ihn nun fest verankerst im proggi oder ueber eine Eingabe oder aus ein File liest, ist unrelevant!

Hab bis jetzt nur Quellcodes mit vielen Extras gefunden und da
steig ich nicht mehr ganz durch :smile:

Wobei hast du denn da Probleme? Du musst nur einmal deine Verbindung öffnen, dann Connecten, dann den Upload machen und dann wieder schliessen? Wie du siehst, eigentlich ganz simple :smile:

Am besten wird es sein, wenn du dir mal einen guten API Guide besorgt und diesen mal studierst :smile:

MfG Alex

PS: Während des Uploades, verliert aber das Proggi die steuerung und sie bekommt sie erst zurueck, wenn der Upload fertig ist. Willst du das muesste man einen anderen Weg gehen .

MfG
Rodario

Hi,

klappt alles einwandfrei und reibungslos!
Vielen Dank für deine Hilfe!!

So eins noch: Ich will, dass die Dateien mit fortlaufender Nummerierung gespeicher werden.
Ich wollte das so machen, dass i bei jedem Aufruf der Funktion um eins erhöht wird. Wie binde ich das i jetzt in den Dateinamen ein?

also in sRemoteFile = „/xxx.txt“?

MfG Rodario

Hallo,

klappt alles einwandfrei und reibungslos!
Vielen Dank für deine Hilfe!!

Nichts zu danken :smile:

So eins noch: Ich will, dass die Dateien mit fortlaufender
Nummerierung gespeicher werden.
Ich wollte das so machen, dass i bei jedem Aufruf der Funktion
um eins erhöht wird. Wie binde ich das i jetzt in den
Dateinamen ein?

also in sRemoteFile = „/xxx.txt“?

Private Sub DeineProzedur
Static Nr as long 'Variable Statisch 
Nr=Nr+1'Wir erhöhen um 1
sRemoteFile = "/download/help/myHelp" & cstr(nr) & ".txt" 'Pfad + Filename wo die Datei abgelegt werden soll

Auf mein Posting bezogen :smile: Die Datei und den Pfad musst du anpassen

MfG Alex

Hi Alex,

ich hab nochmal ne Frage zu der FTP-Geschichte:

Ich wollte, das mir das Programm eine Datei runterläd und habe PutFile durch GetFile ersetzt, das funkrioniert leider nicht!

Was muss ich verändern, damit es geht?

MfG
Rodario

Hallo Rodario,

das geht so einfach nicht. Du greifst auf eine API zu. Diese muss dazu declariert sein und die Parameter muessen schon stimmen!
In deinem Falle, musst du die API

Private Declare Function FtpGetFile Lib "wininet.dll" Alias \_
 "FtpGetFileA" (ByVal hFtpSession As Long, ByVal \_
 lpszRemoteFile As String, ByVal lpszNewFile As String, \_
 ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes \_
 As Long, ByVal dwFlags As Long, ByVal dwContext As Long) \_
 As Long

nutzen :smile:

aufbauend auf mein Bsp. , wo du ja schon eine Verbindung zum Server hast, und ergo auch die hConnection

'fFile = Datei auf dem Server
'lFile = Lokale Datei
'Beachte aber das der Pfad auf dem Server stimmen muss, wo das File liegt
' Den Pfad auf dem Server kannst du mit der API FtpSetCurrentDirectory setzen
' Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" \_
 Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As \_
 Long, ByVal lpszDirectory As String) As Long

'Übergibt ihr einfach die Session ID ( hConnection und den Pfad )
FtpGetFile(hConnection, fFile, lFile, 0, 0, &H80000000 or &H1, 0)

MfG Alex

wegen der FTP-geschichte, um Datein herunterzuladen, kannst du auch das Inet steuerelement benutzen, dabei müsstest du allerdings die eigentlich download routine selber schreiben, aber dafür lernt man auch mehr.

p.s. das ganze schaut mir etwas nach Keylogger aus :wink:

Hi,

wegen der FTP-geschichte, um Datein herunterzuladen, kannst du
auch das Inet steuerelement benutzen, dabei müsstest du
allerdings die eigentlich download routine selber schreiben,
aber dafür lernt man auch mehr.

öhm… sagt mir jetzt erst mal gar nix, aber ich mach mich mal schlau^^

p.s. das ganze schaut mir etwas nach Keylogger aus :wink:

Wie kommst du denn darauf?
Die Tastenabfragen sind, wie oben erklärt, für ein Programm, dass mir meine wichtigsten Programme (Firefox, Icq, Spiele) auf Tastendruck öffnet, die FTP-Geschichte ist für einen Chat, den ich programmieren möchte. Da werden dann die Eingaben.txt hoch- und die Updates heruntergeladen. Bin ganz harmlos^^, mit Viren und dem Krempel hab ich nix am Hut :smile:

MfG Rodario

Hallo,

Hi,

wegen der FTP-geschichte, um Datein herunterzuladen, kannst du
auch das Inet steuerelement benutzen, dabei müsstest du
allerdings die eigentlich download routine selber schreiben,
aber dafür lernt man auch mehr.

Warum auf ein OCX zugreifen, wenn es ohne grossen Aufwand mittels API machbar ist?

öhm… sagt mir jetzt erst mal gar nix, aber ich mach mich mal
schlau^^

Dir gefaellt meine Routine nicht?

p.s. das ganze schaut mir etwas nach Keylogger aus :wink:

Wie kommst du denn darauf?
Die Tastenabfragen sind, wie oben erklärt, für ein Programm,
dass mir meine wichtigsten Programme (Firefox, Icq, Spiele)
auf Tastendruck öffnet, die FTP-Geschichte ist für einen Chat,
den ich programmieren möchte. Da werden dann die Eingaben.txt
hoch- und die Updates heruntergeladen. Bin ganz harmlos^^, mit
Viren und dem Krempel hab ich nix am Hut :smile:

Für ein Chat, sollte man das Winsock Steuerelement nutzen. Ist very easy und hast kaum Arbeit damit!

MfG Alex

Hi,

Dir gefaellt meine Routine nicht?

Habe bis jetzt noch nicht damit weitergemacht, werde es aber auf jeden Fall mal mit deiner Lösung versuchen

Für ein Chat, sollte man das Winsock Steuerelement nutzen. Ist
very easy und hast kaum Arbeit damit!

Ich schaus mir mal an, danke!

MfG Alex

MfG
Rodario