VB 2010 - SendKeys

Programovacie jazyky, rady, poradňa...
parka7
Novice
Novice
Príspevky: 5
Registrovaný: 21 júl 2012, 22:37

VB 2010 - SendKeys

Príspevok od používateľa parka7 »

Zdravím všetkých hojkárov, robím na Visual Basicu 2010 jeden program, kde používam skripty ako sú:
SendKeys.Send() a KeyCode
nemám teda problém s odoslaním nejakej klávesy, ale teraz som došiel na taký problém kde by som potreboval odoslať "pustenie" klávesy, niečo v podobe:
SendKeys.Release(), aj keď viem že takýto skript neexistuje. Respektíve by to malo simulovať nie stlačenie klávesy ale jeho pustenie.

Vie mi s tým niekto pomôcť? Vopred ďakujem.

PS: niekde na anglických fórach som našiel že používajú SendINPUT API, ale boli to príspevky bez odpovedí, a ja s tým však veľmi neviem pracovať. :)
xadman
Medium Star
Medium Star
Príspevky: 305
Registrovaný: 09 mar 2011, 17:02

Re: VB 2010 - SendKeys

Príspevok od používateľa xadman »

Skús pridať niekde event

Kód: Vybrať všetko

OnKeyUp()
parka7
Novice
Novice
Príspevky: 5
Registrovaný: 21 júl 2012, 22:37

Re: VB 2010 - SendKeys

Príspevok od používateľa parka7 »

xadman napísal:Skús pridať niekde event

Kód: Vybrať všetko

OnKeyUp()
Asi ma nerozumieš, ja nepotrebujem vykonať nejakú akciu ak sa pustí klávesa, ale potrebujem práve to pustenie klávesy simulovať.
Tak ako aj funkciu OnKeyPress môžem simulovať práve skriptom SendKeys.Send(), tak aj OnKeyUp sa dá simulovať skriptom .... ?
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: VB 2010 - SendKeys

Príspevok od používateľa manager666 »

V prvom rade, pozor na terminologiu. SendKeys.Send(), ani KeyCode nie su skripty.
V druhom rade, pomocou metody Send() triedy SendKeys nie je mozne simulovat uvolnenie klavesy.

Pomocou WinAPI funkcie SendMessage to uz mozne je. No skor ako ti sem hodim priklad, napis, naco taku simulaciu potrebujes, pretoze WinAPI funkcie by som bral ako poslednu moznost.
:wink:

//autoeditácia príspevku (22 Júl 2012, 11:40)
Obetoval som par minut zo svojho casu a vytvoril jednoduchu ukazkovu triedu:

VB.NET:

Kód: Vybrať všetko

Public Class InputSimulator
    <DllImport("user32.dll", EntryPoint:="SendMessage")> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal message As UInteger, ByVal wParam As ULong, ByVal lParam As ULong) As Long
    End Function
    Private ReadOnly WM_LBUTTONUP As UInteger = &H202
    Private ReadOnly WM_LBUTTONDOWN As UInteger = &H201
    Private ReadOnly WM_KEYDOWN As UInteger = &H100
    Private ReadOnly WM_KEYUP As UInteger = &H101

    Public Sub SendLeftMouseUp(ByVal handle As IntPtr)
        SendMessage(handle, WM_LBUTTONUP, 0, 0)
    End Sub

    Public Sub SendLeftMouseDown(ByVal handle As IntPtr)
        SendMessage(handle, WM_LBUTTONDOWN, 0, 0)
    End Sub

    Public Sub SendKeyUp(ByVal handle As IntPtr, ByVal key As Keys)
        SendMessage(handle, WM_KEYUP, CType(key, ULong), 0)
    End Sub

    Public Sub SendKeyDown(ByVal handle As IntPtr, ByVal key As Keys)
        SendMessage(handle, WM_KEYDOWN, CType(key, ULong), 0)
    End Sub
End Class
C#:

Kód: Vybrať všetko

public class InputSimulator
{
    [DllImport("user32.dll", EntryPoint = "SendMessage")]
    private static extern long SendMessage(IntPtr hWnd, uint message, ulong wParam, long lParam);

    private readonly uint WM_LBUTTONUP = 0x0202;
    private readonly uint WM_LBUTTONDOWN = 0x0201;
    private readonly uint WM_KEYDOWN = 0x0100;
    private readonly uint WM_KEYUP = 0x0101;

    public void SendLeftMouseUp(IntPtr handle)
    {
        SendMessage(handle, WM_LBUTTONUP, 0, 0);
    }

    public void SendLeftMouseDown(IntPtr handle)
    {
        SendMessage(handle, WM_LBUTTONDOWN, 0, 0);
    }

    public void SendKeyUp(IntPtr handle, Keys key)
    {
        SendMessage(handle, WM_KEYUP, (ulong)key, 0);
    }

    public void SendKeyDown(IntPtr handle, Keys key)
    {
        SendMessage(handle, WM_KEYDOWN, (ulong)key, 0);
    }
}
No i tak radsej napis, aky problem riesis simulaciou stlacenia klaves. Je pravdepodobne, ze ho riesis zbytocne komplikovane.
parka7
Novice
Novice
Príspevky: 5
Registrovaný: 21 júl 2012, 22:37

Re: VB 2010 - SendKeys

Príspevok od používateľa parka7 »

Vďaka, ten skript vyzerá dobre a funkčne, napíšem načo mi to treba.
V prvom rade sa chcem ospravedlniť že nepoznám tú terminológiu, teda nerozoznám tie pojmy.

V podstate ak by niekto chcel stlačiť nejakú klávesu, napríklad SHIFT, aby začal písať veľkými písmenami, vložím tam tu funkciu SendKeyUp kde zadám argumenty pre SHIFT, a program mu to bude simulovať pustenie tej klávesy. Tým pádom aj keď bude držať, v reále nebude nazvem to "aktivovaný" a teda bude písať malým. Ale to je len príklad, chcel by som to využiť aj nato, aby si napríklad nemohol spustiť správcu úloh skratkou CTRL+ALT+DELETE, a teda mi stačí vložiť SendKeyUp(CTRL)-/syntax ešte neviem/ do akcie kde stlačím CTRL, a tým mu to už správcu úloh nespustí, pretože akoby stlačil len ALT+DELETE. :)

Robím taký zabezpečovací program, len si skúšam svoje schopnosti. Ten skript vyzerá byť plne funkčný, len mi ešte chýba vedieť čo mám doplniť za argumenty do tých funkcií SendKeyUp (kde je (ByVal handle As IntPtr, ByVal key As Keys)), teda to handle a key
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: VB 2010 - SendKeys

Príspevok od používateľa manager666 »

Ak som ta pochopil spravne, tak chces uzivatelovi povolit iba male pismena. Na to ziadne odchytavanie shiftu nepotrebujes. Prve, co ma napadlo, je osetrit udalost KeyPress tak, ze kazdy zadany znak sa prevedie na maly pomocou triedy Char a metody ToLower.

Dalej, obist CTRL+ALT+DELETE nie je take jednoduche, ako si ty predstavujes... Ako na to ti nenapisem, lebo si nemyslim, ze by si to mal obchadzat. A to, ze nevies ake parametre mas pouzit napr. v metode SendKeyUp ma v tom iba utvrdzuje. No nebudem zly a uvediem ti mozny priklad pouzitia:

Kód: Vybrať všetko

Dim simulator As New InputSimulator()
simulator.SendKeyUp(Me.Handle, Keys.A)
parka7
Novice
Novice
Príspevky: 5
Registrovaný: 21 júl 2012, 22:37

Re: VB 2010 - SendKeys

Príspevok od používateľa parka7 »

V poriadku, napíšem na čom pracujem :D Proste chcem spraviť program, ktorý zahesluje počítač takým spôsobom, že sa ukáže len okno v ktorom bude zadajte heslo, naokolo okna bude čierna priehľadná obrazovka, takže sa nebude môcť kliknúť nikde, len na zadanie hesla. To už mám, problém je ale v tom že si to môže človek cez správcu úloh vypnúť, a to je potom zabezpečenie naprd :)

Takže jediné čo mi zatiaľ chýba je deaktivovať všetky možné tlačidlá na klávesnici ako ľavý Windows, pravý Windows, ctrl+alt+delete a možno niekoľko ďalších skratiek, ktorými by si mohla cudzia osoba program vypnúť a teda získať prístup ku PC.
Viem že sa dá jednoducho zaheslovať PC klasickým užívateľským heslom, ale chcel som si vyskúšať urobiť takýto program, a už som pri konci.

Použil som tvoj príklad, vytvoril som si Class1 a šupol som tvoj skript pri stlačení Ctrl, avšak keď som ho spustil a stlačil Ctrl, vyhodilo mi toto :/ : http://www.ourupload.wz.cz/file/1204/error.jpg

Ešte raz sa ospravedlňujem, len sa s VB učím, a skúšam rôzne vychytávky čo dokáže :)
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: VB 2010 - SendKeys

Príspevok od používateľa manager666 »

parka7 napísal:Takže jediné čo mi zatiaľ chýba je deaktivovať všetky možné tlačidlá na klávesnici ako ľavý Windows, pravý Windows, ctrl+alt+delete
Tou ukazkovou triedou, ktoru som ti sem dal, to urcite nedosiahnes.
Vo svojich zaciatkoch som programoval presne tu istu aplikaciu, avsak v staruckom Visual Basicu. Bohuzial, musim ta sklamat. Momentalne nemas dostatocne znalosti, aby si take nieco zvladol. Len sa vzdelavaj dalej a ja verim, ze sa ti to raz podari naprogramovat. (Minimalne na Windows XP, pre Vistu, Windows 7, Windows 8 je to daleko komplikovanejsie)
parka7
Novice
Novice
Príspevky: 5
Registrovaný: 21 júl 2012, 22:37

Re: VB 2010 - SendKeys

Príspevok od používateľa parka7 »

Viem čo sú začiatky, s inými programami mám skúsenosti veľmi dobré. S VB som sa stretol pred niekoľkými rokmi, ale stále akoby zaostávam na tom istom mieste. Teda sám viem že v ňom nemám dostatočné skúsenosti, ale ako sa mám vzdelávať keď sa nemám čoho chytiť? Teraz ma to akurát len odradí od práce a ďalšia snaha skončí v koši.
Myslel som že práve ukážkovým príkladom zistím ako čo funguje, inak by som ostal len pri klasickom okne s textboxmi a inputboxmi :S
jojinkho
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 341
Registrovaný: 30 aug 2007, 9:37

Re: VB 2010 - SendKeys

Príspevok od používateľa jojinkho »

Keď sa to tu už rieši. Dá sa v C# nejako poslať držanie klávesy?
Keď dám napr. SendKeys.Send("(9)"); Tak je efekt ako keby som klepal do klávesy, a keď chcem aby bola stále stlačená?
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: VB 2010 - SendKeys

Príspevok od používateľa manager666 »

To je korektne chovanie, "deviatka" nie je kontextova klavesa.
Napísať odpoveď