PostKeyEx32 punkt?
Hej!
Nu är det så att jag håller på med ett litet program här hemma som jag skulle behöva lite hjälp med!
Jag använder den här koden:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean) ;
type
TShiftKeyInfo = record
shift: Byte ;
vkey: Byte ;
end;
ByteSet = set of 0..7 ;
const
shiftkeys: array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl) ; vkey: VK_CONTROL),
(shift: Ord(ssShift) ; vkey: VK_SHIFT),
(shift: Ord(ssAlt) ; vkey: VK_MENU));
var
flag: DWORD;
bShift: ByteSet absolute shift;
j: Integer;
begin
for j := 1 to 3 do
begin
if shiftkeys[j].shift in bShift then
keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), 0, 0) ;
end;
if specialkey then
flag := KEYEVENTF_EXTENDEDKEY
else
flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;
for j := 3 downto 1 do
begin
if shiftkeys[j].shift in bShift then
keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), KEYEVENTF_KEYUP, 0) ;
end;
end;
Sen anropar jag koden med typ:
PostKeyEx32(VK_NUMPAD6, [], False);
Eller:
PostKeyEx32(VK_NUMPAD6, [ssAlt], False);
Eller:
PostKeyEx32(VK_F4, [ssAlt], False);
Ja ni fattar hoppas jag :P
Men nu undrar jag hur jag ska kunna skicka punkt men postkey, hittar inte vad för kod som behövs!
Svara
Sv:PostKeyEx32 punkt?
Okej tack!
Men jag får det inte att funka!, :/ provade med det här:
PostKeyEx32(ORD('H'), [], False);
PostKeyEx32(ORD(':'), [], False);
PostKeyEx32(ORD('J'), [], False);
och
PostKeyEx32(ORD('H'), [], False);
PostKeyEx32(46, [], False);
PostKeyEx32(ORD('J'), [], False);
Men det vill sig inte.. Det skriver ut h och j men inte punkten..
Svara
Sv: PostKeyEx32 punkt?
mmm.... varför är du inte konsekvent och skriver
PostKeyEx32(ORD('.'), [], False);
Functionen vill ha Word tror det är där det strular.
Svara
Sv:PostKeyEx32 punkt?
Testade att skriva
Showmessage (IntToStr(Ord('.')))
Det funkade ua 46 blev svaret.
DVS Asciitecken består av 2 byte Word Intelstandard 2E00 RawHex 002E
Ordinal svarar med Word. 0.. 65535
Skriver du bara 46 blir det SmallInt -32768 .. 32767
Svara
Sv: PostKeyEx32 punkt?
Svara på båda här!
Skrev fel här menade att jag skrev . istället för :
Men det värkar bara inte funka.
EDIT:
Och nä det funkar inte häller om jag bara skriver
PostKeyEx32(ORD('.'), [], False);
Det blir ingenting där punkten ska vara :/
Svara
Sv:PostKeyEx32 punkt?
Det var lurigt, det här skall redas ut ! Testa
PostKeyEx32(ORD(','), [], False);
PostKeyEx32(ORD('-'), [], False);
44 , 45
Stora A börjar på 65 har du satt en undre gräns i [......]
Testa också
PostKeyEx32(ORD('8'), [], False); // valfri siffra
Ord(':') är ju 58 dvs verkar som du har en undre gräns vid 48 något
Svara
Sv: PostKeyEx32 punkt?
Ska vi se att skriva , och - funkade ej det blev blankt.
men att skriva 8 på det viset fungerade utmärkt!
Sen kanske jag ska tilllägga att det inte är jag som har skrevigt koden, hitta den på internet :P
Svara
Sv: PostKeyEx32 punkt?
Tror jag kom på det.
Testa med både Shift och Alt och True
Har något med svenskt tangenbord att göra.
Testa Ord('Ö')
Svara
Sv:PostKeyEx32 punkt?
hmm har provat lite olika nu:
PostKeyEx32(Ord('.'), [], False);
PostKeyEx32(Ord('.'), [], True);
PostKeyEx32(Ord('.'), [ssAlt], False);
PostKeyEx32(Ord('.'), [ssAlt], True);
PostKeyEx32(Ord('.'), [ssShift], False);
PostKeyEx32(Ord('.'), [ssShift], True);
PostKeyEx32(Ord('.'), [ssAlt, ssShift], False);
PostKeyEx32(Ord('.'), [ssAlt, ssShift], True);
men inget vill sig funka och sen så funka det inte häller när jag skulle prova att få ut Ö..
Svara
Sv: PostKeyEx32 punkt?
Oki det var lurigt.
Skall ladda ner dit exempel och testa lite själv.
Återkommer på denna kanal.
Finns det något annat geni därute som kommer på vad det kan vara ?
Svara
Sv:PostKeyEx32 punkt?
Okej tack :)
Kom och tänka ifall man kunnde använda alt + siffror så får man fram bokstäver/siffror/tecken med rätt kompination.
Skrev en lista för ett tag sedan och där hittade jag Alt+46 blir då .
Så om man kunnde använda det för att få fram en punkt men jag fick inte det att funka :/
Svara
Sv: PostKeyEx32 punkt?
mmm... har nu provkört exemplet och börjar förstå. Obs börjar.
Funktionen kan bara exekvera sådant som Windows System godkänner som short cut.
Vad skall du använda detta till ? Varför vill du ha (.) punkt ?
Man kan bara skicka tecken som har både UperCase och LowerCase (Versaler o Gemena)
I Keyargumentet kan man bara ha UperCase tecken ex.'A' och svar ut kommer 'a'
Punkt '.' som ex har bara ett läge godkännes ej.
Svara
Sv:PostKeyEx32 punkt?
Här är en annan mer rak metod. Jag gör SendKeys till Edit1.
Obs Edit1 skall vara tom i designläge.
Du kan kanske göra en kombination av de båda Subrutinerna.
<code>
'// Example:
'//Du kan skicka till alla fönster som har HWnd (handler) här Edit1
procedure TForm1.Button1Click(Sender: TObject);
var
HWin : Integer ;
begin
HWin := Edit1.Handle ;
SendKeys('.',HWin) ;
end;
procedure SendKeys(S: string; Window: hWnd);
var
i: Integer;
begin
ShowWindow(Window, SW_RESTORE);
for i := 1 to Length(S) do
SendMessage(Window, WM_CHAR, Ord(S[i]), 0);
end;
</code>
Svara
Sv: PostKeyEx32 punkt?
Här en modifierad version när du önskar skicka kombinerade argument,
ex. Ctrl + F5 mfl.
Fortfarand brister men nu är Vi på väg.
<code>
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
type
TShiftKeyInfo = record
shift: Byte;
vkey: Byte;
end;
byteset = set of 0..7;
const
shiftkeys: array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl); vkey: VK_CONTROL),
(shift: Ord(ssShift); vkey: VK_SHIFT),
(shift: Ord(ssAlt); vkey: VK_MENU));
var
flag: DWORD;
bShift: ByteSet absolute shift;
i : Integer ;
begin
for i := 1 to 3 do
begin
if shiftkeys[i].shift in bShift then
keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
end; { For }
if specialkey then
flag := KEYEVENTF_EXTENDEDKEY
else
flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);
for i := 3 downto 1 do
begin
if shiftkeys[i].shift in bShift then
keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
KEYEVENTF_KEYUP, 0);
end; { For }
end; { PostKeyEx32 }
procedure SendKeys(S: Char; Window: hWnd);
begin
If Not(S in ['0'..'Z']) Then Begin
ShowWindow(Window, SW_RESTORE);
SendMessage(Window, WM_CHAR, Ord(S), 0)
End
Else Begin
Form1.Edit1.SetFocus ;// inte bra den rensar Edit1 och lägger till det senaste
PostKeyEx32(Ord(S),[ssShift], False);
End
End ;
// Test exempel skickar till Edit1
procedure TForm1.Button1Click(Sender: TObject);
begin
SendKeys('Ö',Form1.Edit1.handle)
end;
</code>
Svara
Sv:PostKeyEx32 punkt?
Vid närmare eftertanke tycker jag att det är onödigt att kombinera dessa 2
Kör den du har nu om du vill skicka kombinationer Ctrl Alt Shift och F1- F12
och
Använd denna om du bara köra enkla Sendkeys till fönster.
<code>
'// Example:
'//Du kan skicka till alla fönster som har HWnd (handler) här Edit1
procedure SendKeys(S: string; Window: hWnd);
var
i: Integer;
begin
ShowWindow(Window, SW_RESTORE);
for i := 1 to Length(S) do
SendMessage(Window, WM_CHAR, Ord(S[i]), 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
HWin : Integer ;
begin
HWin := Edit1.Handle ;
SendKeys('Tobias',HWin) ;
end;
</code>
Svara
Sv: PostKeyEx32 punkt?
Hej!
Tack så mycket för allt.
Men hur ska man göra om man vill skicka till ett annat fönster alltså som inte tillhör programet!?
EDIT:
Och jag vet inte vad programet som den ska skriva i exakt. för det ändrar title hela tiden.
Så det som jag vill få det att funka är med den koden jag har innan att få den skriva i det fönstret som ligger överst..
Hoppas du förstår!
Svara
Sv:PostKeyEx32 punkt?
Jag förstår. Tex ett Worddokument eller NotPad mfl.
Skall kolla det och nu resonerar jag kring Sendkeys.
Svara