|
Profil
Zdjęcie użytkownika
Ocena
Opcje
Prywatny komunikat
olesio nie posiada prywatnego komuniakatu.
Prywatne informacje
olesio
Pomocna dłoń
Wiek nieznany
Płeć nie została ustawiona
Szczecin
Data nieznana
Zainteresowania
Brak informacji
Inne informacje
Gadu-Gadu: 478088
Statystyki
Dołączył: sob, 22 wrz 07
Wyświetleń profilu: 1,412*
Ostatnio widziany: Dzisiaj, 10 wrz 2010 21:03
Czas lokalny: pią, 10 wrz 2010 - 22:00
261 postów (0 postów na dzień)
Informacje kontaktowe
Brak informacji
Brak informacji
Brak informacji
Brak informacji
* Wyświetlenia profilu aktualizowane są co godzinę
|
Tematy
Posty
Komentarze
Znajomi
Moja zawartość
1 Aug 2010
Mam taki kod jak poniżej, ale on nie działa. Hook przechwytuje po wywołaniu procedury HookIt; wszystkie wciskane klawisze, ale ja chcę
osiągnąć coś takiego, że jak wcisne na przykład spację (vkCode 32) to wciskany jest zamiast niej klawisz kursor w dół (vkCode 40),, a nie mogę zrobić tego przez Keybd_Event, bo aplikacja docelowa jest emulatorem pisanym z użyciem DirectX i nie reaguje w trakcie grania na taki kod jak Keybd_Event. Prawdodpodobnie trzeba by wykorzystać chyba jakoś stałą LLKHF_INJECTED, ale nie bardzo wiem jak to zrobić. Prosił bym o jakiś przykładowy kod. Bo niestety ze znajomością C u mnie słabo i lektura hook.cpp ze źródel AutoHotKeya nic mi nie dała. A i wiem, że można zablokowac dany klawisz dając Result := 1; lub Result := 32; po czym Exit, ale ja nie chce blokowac, chcę podmienić. Delphi //... const WH_KEYBOARD_LL = $000D; LLKHF_EXTENDED = $0001; LLKHF_INJECTED = $0010; LLKHF_ALTDOWN = $0020; LLKHF_UP = $0080; type tagKBDLLHOOKSTRUCT = packed record vkCode : DWord; ScanCode : DWord; Flags : DWord; Time : DWord; dwExtraInfo : integer; end; KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT; PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; var HKHook : HHook; function LowLevelKeyboardProc(nCode : Integer; wParam : Integer; lParam : Integer) : Integer; stdcall; export; var Hook : PKBDLLHOOKSTRUCT; begin Hook := Pointer(lParam); case nCode of HC_ACTION : begin if Hook.vkCode = 32 then begin Hook.vkCode := 40; lParam := Integer(@Hook); Result := CallNextHookEx(HKHook, nCode, wParam, lParam); Exit; end; end; end; Result := CallNextHookEx(HKHook, nCode, wParam, lParam); end; procedure HookIt; begin HKHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0); end; //...
17 Jul 2010
Witam.
Może i problem prosty ale mam zaćmienie i nie potrafię wykombinować. Chciałbym aby do Memo dodały mi się uchwyty, nazwy klasy i teksty (poza Memo) z kontrolek na formatce (w ramach testu mam swoją własną formatkę, ale docelowo to ma czytać z okna wskazanego przez FindWindow). Bez sensu jest pisanie kolejnych zmiennych TempH(Numer), może da to się zrobić inaczej - może rekurencyjnie, ale nie mam na to pomysłu. Chce mieć taki efekt że jak mam na formatce na przykład dwa panele, a w tych panelach są kolejne panele i na nich coś jeszcze to wszystko elegancko zapisze się mi do Memo uwzględniajać kolejnych rodziców komponentów bez względu na to ile ich będzie. Jak ma ktoś pomysł, to piszcie. Delphi procedure AddToMemo(AHandle : HWND; AName, AText : string); begin with Form1 do begin if AName = 'TMemo' then begin AText := ''; end; Memo1.Lines.Add(Format('Handle: %s Class: %s Text: %s', [IntToHex(AHandle, 2), AName, AText])); end; end; procedure TForm1.Button2Click(Sender: TObject); var WinH, ControlH, TempH, TempH2 : HWND; ControlName, ControlText : array[0..255] of Char; begin Memo1.Clear; WinH := Form1.Handle; ControlH := GetWindow(WinH, GW_CHILD); while ControlH <> 0 do begin GetClassName(ControlH, ControlName, SizeOf(ControlName)); SendMessage(ControlH, WM_GETTEXT, SizeOf(ControlText), integer(@ControlText)); AddToMemo(ControlH, ControlName, ControlText); TempH := GetWindow(ControlH, GW_CHILD); while TempH <> 0 do begin GetClassName(TempH, ControlName, SizeOf(ControlName)); SendMessage(TempH, WM_GETTEXT, SizeOf(ControlText), integer(@ControlText)); AddToMemo(TempH, ControlName, ControlText); TempH2 := GetWindow(TempH, GW_CHILD); while TempH2 <> 0 do begin GetClassName(TempH2, ControlName, SizeOf(ControlName)); SendMessage(TempH2, WM_GETTEXT, SizeOf(ControlText), integer(@ControlText)); AddToMemo(TempH2, ControlName, ControlText); TempH2 := GetWindow(TempH2, GW_CHILD); end; TempH := GetWindow(TempH, GW_HWNDNEXT); end; COntrolH := GetWindow(ControlH, GW_HWNDNEXT); end; end; EDIT: Już sobie poradziłem, zapomniałem o takiej metodzie jak EnumChildWindows, a opisana jest ona na stronie http://www.swissdelphicenter.ch/torry/showcode.php?id=419
8 May 2010
Witam.
Kiedyś na tym forum bardzo pomógł mi CubixMaister. Gdyż ja sobie w ogóle nie radzę z użyciem TreeView. Mam poniższy kod, a w Memo2 (użyłem go tymczasowo do testów) następujące wpisy: KOD olesiopl/ olesiopl/Dokumenty/ olesiopl/Galeria/ olesiopl/Prywatne/ olesiopl/Prywatne/3/ olesiopl/Prywatne/3/a/ I efekt jest taki jak widać i nie do końca mi odpowiada. ![]() Jednak ja chcę uzyskać to samo. Tylko bez pierwszego elementu olesiopl/. Po prostu element pod nim, o nazwie olesiopl ma być głownym. Kombinowałem, lecz mi nie wychodziło. Proszę o pomoć. Próbowalem znaleźć inny post tutaj gdzie kiedyś ktoś pytał o podbną kwestię i zaprponował nawet z tego co pamiętam swoj jakiś kod, ale nie mogę znaleźć tego posta ani w google ani przez szukaj. Czyli podsumowując chcę osiągnąc taki efekt, który widać poniżej, a ktory to uzyskałem mozolnie w kodzie dodając kolejne elementy z na sztywno wpisanymi nazwami folderów, a wiadomo to złe. ![]() Delphi procedure TForm1.ReadFolderListToTreeView; function GetNode(const Text : string; Owner : TTreeNodes; Parent : TTreeNode) : TTreeNode; var I : integer; begin if (Trim(Text) = '') then begin Result := Parent; Exit; end else Result := nil; for i := 0 to Parent.Count - 1 do if (Parent[I].Text = Text) then begin Result := Parent[I]; Break; end; if not Assigned(Result) then Result := Owner.AddChild(Parent, Text); end; var Data : TStrings; Node : TTreeNode; I, Offset, P : integer; begin Data := Memo2.Lines; TreeView.Items.Clear; Node := TreeView.Items.Add(nil, Data[0]); for I := 0 to Data.Count - 1 do begin Node := TreeView.Items.GetFirstNode; P := Pos('/', Data[I]); while (P > 0) do begin Node := GetNode(Copy(Data[I], Offset, P - Offset), TreeView.Items, Node); Offset := P + 1; P := PosEx('/', Data[I], Offset); end; end; for I := 0 to TreeView.Items.Count - 1 do begin TreeView.Items[I].Expand(False); TreeView.Items[I].ImageIndex := 0; end; TreeView.Items[0].Selected := True; TreeView.Items[0].Expand(False); end;
29 Apr 2010
Witam.
Kombinuje z WinApi, przeglądam MSDNa, ale nadal mi nie wychodzi. Chce uzyskać taki efekt jak przy programowaniu VCL kiedy to dla Formatki ustawimy własność BorderStyle na bsDialog, czyli bez ikonki programu, bez menu i tylko przycisk do zamykania aplikacji mają być na pasku, a rosszerzanie formatki ma nie być możliwe. Dodatkowo chciałbym, aby aplikacja nie pojawiała się na pasku zadań. Póki co zrobiłem tak jak poniżej, lecz aplikacja jest wtedy bez żadnych przycisków i ma dośyć brzydką ramkę, jak dodam WS_EX_TOOLWINDOW to okno ma małą belkę tytułową oraz maly przycisk do zamykania, a tego nie chcę. Poza tym wtedy kawałek formatki pod belką tytułową jest przeźroczysty i pod nim widać to co jest w tle. Dlatego prosiłbym o jakiś przykład jak stworzyć takie okno jak opisałem przez CreateWindow lub może CreateWindowEx, a później ukryć mu belkę na pasku zadan przez SetWindowLong. W aplikacjach VCL, nie ma z tym problemów, ale w WinApi niestety mi nie wychodzi. Zaś analiza kodu modułu Forms nie za wiele mi pomogła tutaj. Delphi function WndProc(Wnd : HWND; uMsg : UINT; wPar : WPARAM; lPar : LPARAM) : LRESULT; stdcall; var St, StEx : LongWord; begin Result := 0; case uMsg of WM_CREATE : begin St := GetWindowLong(Wnd, GWL_STYLE); StEx := GetWindowLong(Wnd, GWL_EXSTYLE); SetWindowLong(Wnd, GWL_EXSTYLE, not WS_EX_APPWINDOW); end; // .... Okno tworzę i pokazuje tak: Delphi //... WindowHandle := CreateWindow(App_Class, 'Aplikacja odbierająca komunikat WM_COPYDATA', WS_VISIBLE + WS_SYSMENU {+ WS_TILEDWINDOW}, (Screen_Width - Window_Width) div 2, (Screen_Height - Window_Height) div 2, Window_Width, Window_Height, 0, 0, hInstance, nil); ShowWindow(WindowHandle, SW_SHOW);
10 Mar 2010
Chciałem sobie napisać program pobierający zdjęcia ze strony pewnego szczecińskiego klubu. W sumie
to byłem tam ostatni raz pare lat temu jak zwał się Lokomotywa, ale do rzeczy. Poniższe kody prezentują to co wyśledziłem przy pomocy WireSharka i co potrzebne jest do logowania. W czym problem. O ile kod z użyciem komponentu Indy działa poprawnie i pobiera do pliku test_ (stronę po zalogowaniu) oraz stronę galeri zdjęć (galeria_), to kod z użyciem Synapse pobiera ok tylko stronę po zalogowaniu, a dla galerii zwraca mi plik z informacją o błednym zapytaniu (kod 400). Strona nie przekierowuje na inny adres, bo sprawdzałem w nagłówkach, a poza tym IdHttp1 ma domyślnie zostawione HandleRedirects na False. Co robię nie tak? Jak zrobić żeby pod Synapse też działało, bo szczerze pisząc wolał bym w programie użyć raczej komponentu Synapse. Z dokumentacji wyczytałem że KeepAlive jest i tak domyślnie na True, ale nie wiem czy to ma tutaj jakiekolwiek znaczenie. Przy pobieraniu metodą GET sprawdziłem cookies i są nadal takie same jak przy POST. Na samym końcu wklejam wygląd pliku galeria_ oraz naglowki. Z góry dziękuję za wszelką pomoc. Bo póki nie okiełznam Synapse, w tej kwestji, to nie rusze dalej z kodem. INDY: Delphi var Input, Output : TStringStream; begin Input := TStringStream.Create(''); Output := TStringStream.Create(''); IdHttp1.Request.UserAgent := 'User-Agent: Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10'; IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded'; IdHttp1.Port := 80; IdHttp1.Host := '78.46.103.181'; Input.WriteString('login=' + UserEdit.Text + '&pass=' + PassEdit.Text + '&action=zaloguj'); IdHttp1.Connect; IdHttp1.Post('http://www.heyaclub.pl/index.php?go=profile', Input, Output); Memo1.Text := Output.DataString; Memo1.Lines.SaveToFile('D:\test_indy.html'); Memo1.Text := IdHttp1.Get('http://www.heyaclub.pl/index.php?go=galeria'); Memo1.Lines.SaveToFile('D:\galeria_indy.html'); IdHttp1.Disconnect; end; Synapse: Delphi var UrlData : string; SynHttp : THttpSend; begin SynHttp := THttpSend.Create; UrlData := 'login=' + UserEdit.Text + '&pass=' + PassEdit.Text + '&action=zaloguj'; SynHttp.TargetPort := '80'; SynHttp.TargetHost := '78.46.103.181'; SynHttp.UserAgent := 'User-Agent: Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10'; SynHttp.MimeType := 'application/x-www-form-urlencoded'; SynHttp.Document.Write(Pointer(URLData)^, Length(URLData)); SynHttp.HTTPMethod('POST', 'http://www.heyaclub.pl/index.php?go=profile'); Memo1.Lines.LoadFromStream(SynHttp.Document); Memo1.Lines.SaveToFile('D:\test_synapse.html'); SynHttp.HTTPMethod('GET', 'http://www.heyaclub.pl/index.php?go=galeria'); SynHttp.Headers.SaveToFile('D:\naglowki_synapse.txt'); Memo1.Lines.LoadFromStream(SynHttp.Document); Memo1.Lines.SaveToFile('D:\galeria_synapse.html'); SynHttp.Free; end; Wygląd pliku galeria_synapse.html: KOD <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> Request header field is missing ':' separator.<br /> <pre> HTTP/1.1 200 OK</pre> </p> <hr> <address>Apache/2 Server at localhost Port 80</address> </body></html> Wygląd pliku naglowki_synapse.txt: KOD HTTP/1.1 400 Bad Request
Date: Wed, 10 Mar 2010 01:46:48 GMT Server: Apache/2 Content-Length: 368 Connection: close Content-Type: text/html; charset=iso-8859-1 |
Ostatnio byli
Komentarze
Inni użytkownicy nie zostawili komentarzy dla olesio.
Znajomi
|
|
Wersja Lo-Fi | Aktualny czas: piątek, 10 wrzesień 2010 - 23:00 |