Witaj Gościu ( Zaloguj | Rejestruj )

Profil
Zdjęcie użytkownika
Ocena
 
Opcje
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
AIM Brak informacji
Yahoo Brak informacji
ICQ Brak informacji
MSN Brak informacji
Contact Prywatne
* Wyświetlenia profilu aktualizowane są co godzinę

olesio

Super użytkownicy


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.
Obrazek
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.
Obrazek

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


niedziela, 01 sierpień 2010 - 11:35


poniedziałek, 07 czerwiec 2010 - 01:15


wtorek, 25 maj 2010 - 22:49


czwartek, 29 kwiecień 2010 - 09:51


czwartek, 18 marzec 2010 - 23:46

Komentarze
Inni użytkownicy nie zostawili komentarzy dla olesio.

Znajomi

38 postów
Aktywny: środa, 15 lipiec 2009 - 19:58

144 postów
Aktywny: wtorek, 07 lipiec 2009 - 14:29
Zobacz wszystkich znajomych
RSS Wersja Lo-Fi Aktualny czas: piątek, 10 wrzesień 2010 - 23:00