Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kein Event vom Timer Win7 (https://www.delphipraxis.net/144941-kein-event-vom-timer-win7.html)

EWeiss 20. Dez 2009 09:16


Kein Event vom Timer Win7
 
Ich erstelle einen Timer über MMSystem


Delphi-Quellcode:
procedure TimerProc(wTimerID: DWORD; Msg: DWORD;
                                     dwUser: longint;
                                     dw1: longint;
                                     dw2: longint); stdcall;
begin
  PostMessage(RenderHandle, MyTimerMessage, dw1, dw2);

end;
Delphi-Quellcode:
RenderHandle := Classes.AllocateHWnd(RenderProc);
TimerID := timeSetEvent(25, 300, @TimerProc, RenderHandle, TIME_PERIODIC);
Delphi-Quellcode:
procedure RenderProc(var Msg: TMessage);
begin
  blabla..;

end;
In Xp feuert der Timer richtig ab..

Unter Win7 geht so gut wie gar nichts.
System ist schnell genug daran liegt es nicht.

Sieht so aus das mein Event in der RenderProc nicht richtig ankommt.
Die Fenster scheinen das irgendwie zu blocken.

Jemand ne ahnung was das sein könnte?

EDIT:
Es liegt an der Oberfläsche von Win7.
Sobald ich die Visuellen Style ausschalte funktioniert das Event wieder. Was soll denn der Mist jetzt. :wall:

Gibt es eine alternative die Funktioniert?

gruss Emil

himitsu 20. Dez 2009 10:08

Re: Kein Event vom Timer Win7
 
- stimmt das Fensterhandle (RenderHandle)?
- wurde der Timer (TimerID) erstellt?
- wird TimerProc wirklich nicht aufgerufen?
- wenn du RenderHandle an TimerProc übergibst, warum nutzt du dann eine böse globale Variable?
- seit Vista sind viele Dinge verboten ... hast du von der Stelle, wo RenderProc aufgerufen wird, überhaupt das Recht an das Fenster eine Nachricht zu schicken?
- uvw., also anwelcher Stelle genau wird diese Kette unterbrochen?
daß am Ende nichts ankommt sagt ja nichts darüber aus, wo es genau hängt.

EWeiss 20. Dez 2009 10:23

Re: Kein Event vom Timer Win7
 
Zitat:

Zitat von himitsu
- stimmt das Fensterhandle (RenderHandle)?
- wurde der Timer (TimerID) erstellt?
- wird TimerProc wirklich nicht aufgerufen?
- wenn du RenderHandle an TimerProc übergibst, warum nutzt du dann eine böse globale Variable?
- seit Vista sind viele Dinge verboten ... hast du von der Stelle, wo RenderProc aufgerufen wird, überhaupt das Recht an das Fenster eine Nachricht zu schicken?
- uvw., also anwelcher Stelle genau wird diese Kette unterbrochen?
daß am Ende nichts ankommt sagt ja nichts darüber aus, wo es genau hängt.

UAC ist aus ;)
Habe erstmal alle rechte .. bis auf ein paar kleine.

Die anderen Fragen sind schnell geklärt.
Deaktiviere ich in der EXE unter Kompatibilität Visuelle Design und Desktopgestaltung funktioniert alles so wie es soll.
Texte werden an mein Fenster (Caption) geschickt und in allen von mir erstellten Samples von C# -> VB funktioniert der Timer

Ist die Desktopgestaltung an wird kein Text (SongTitel) mehr an mein fenster geschickt und mein Timer in der DLL macht ärger
weil er kein Event mehr bekommt.

Kannst du oder jemand anderer mir sagen wie das Fenster heißt welches Transparent dargestellt wird?
Denke nur wenn ich das Handle habe funktioniert das wieder alles hier.
Warum das Fenster kein Event empfängt ist mir schleierhaft.

EDIT:
Wenn die Fenster Transparent sind und ich sie aktiviere/deaktiviere dann geht das Rendern
aber das ist kein zustand.
Die gleichen Dateien nur nach XP kopiert laufen alle ohne probleme.

gruss Emil

himitsu 20. Dez 2009 10:49

Re: Kein Event vom Timer Win7
 
Application (Application.Handle) hat so ein Hier im Forum suchenMessageOnlyWindow ... falls du grad sowas meintest :gruebel:

jbg 20. Dez 2009 10:52

Re: Kein Event vom Timer Win7
 
Ist jetzt nur eine Vermutung da ich schlecht hinter das "..." bei RenderProc schauen kann, aber rufst du in deiner RenderProc auch ordnungsgemäß DefWindowProc auf? Windows kann nämlich ziemlich seltsam reagieren, wenn der Aufruf fehlt.

EWeiss 20. Dez 2009 10:55

Re: Kein Event vom Timer Win7
 
Zitat:

Zitat von jbg
Ist jetzt nur eine Vermutung da ich schlecht hinter das "..." bei RenderProc schauen kann, aber rufst du in deiner RenderProc auch ordnungsgemäß DefWindowProc auf? Windows kann nämlich ziemlich seltsam reagieren, wenn der Aufruf fehlt.

Danke ja..
Sagte ja schon es läuft alles Hundertprozentig unter XP oder WIN7 wenn ich die Desktopgestaltung in der EXE deaktiviere.

gruss Emil

EWeiss 20. Dez 2009 10:58

Re: Kein Event vom Timer Win7
 
Zitat:

Zitat von himitsu
Application (Application.Handle) hat so ein Hier im Forum suchenMessageOnlyWindow ... falls du grad sowas meintest :gruebel:

Mir einem Window das ich selbst erstellt habe funktioniert es ja auch.
Aber die Anwendungen sind nicht NonVcl

Ich meinte eigentlich das Window welches Transparent ist ..
Keine ahnung ob dieses eine eigene Class besitzt.

gruss Emil

jbg 20. Dez 2009 11:04

Re: Kein Event vom Timer Win7
 
Also ich habe jetzt mal schnell eine Testanwendung geschrieben (Win7, AeroGlass aktiv) und wenn ich einen BreakPoint auf das "Write;" lege, dann hält der Debugger dort auch an und das wegen dem Timer-Event mehrmals.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure RenderProc(var Msg: TMessage);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  RenderHandle: THandle;
  TimerID: Integer;

procedure TimerProc(wTimerID: DWORD; Msg: DWORD;
                                     dwUser: longint;
                                     dw1: longint;
                                     dw2: longint); stdcall;
begin
  PostMessage(RenderHandle, MyTimerMessage, dw1, dw2);
end;

procedure TForm1.RenderProc(var Msg: TMessage);
begin
  if Msg.Msg = MyTimerMessage then
    Write; // << Breakpoint hier
  with Msg do
    Result := DefWindowProc(RenderHandle, Msg, WParam, LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RenderHandle := Classes.AllocateHWnd(RenderProc);
  TimerID := timeSetEvent(25, 300, @TimerProc, RenderHandle, TIME_PERIODIC);
end;

EWeiss 20. Dez 2009 11:24

Re: Kein Event vom Timer Win7
 
@jbg

Ja so wird es funktionieren und so habe ich es auch.. bis auf eins ;)
Ich übergebe mein Windowhandle an eine DLL und dort wird der Timer ausgeführt.

Das ist komplett etwas anderes als wenn ich einen Timer auf meine Form lege
die feuert immer Events solange wie ich innerhalb der Form bleibe.

Trotzdem Danke ! :)

gruss Emil

EWeiss 20. Dez 2009 19:02

Re: Kein Event vom Timer Win7
 
Frage aus dem Netz.

Zitat:

The first symptom we saw is that WM_GETTEXT and WM_GETTEXTLENGTH used on the buttons of the windows calculator are not retrieving the caption data as in win xp. The second symptom is that using the Spy++ tool from visual studio also doesn't get a caption from the calculator buttons.
Any ideas why this doesn't work anymore on Windows 7? Is there an alternative way to retrieve the caption in Windows 7?
Irgendwas an den Fenstern wurde geändert das ein "Application.Handle, frmMain.Handle" keine auswirkung mehr hat.

Hab noch nichts gefunden was da weiter hilft.
GEhört zum selben Thema um überhaupt mal feststellen zu können ob das Fenster eine Message erhält!


Zitat:

Es gibt es weitere typische Dinge, warum ein direktes
SendMessage ggf. nicht funktionieren "kann" ist:

Ab Vista / Server 2008 / Windows 7 und später gilt die: UIPI
Anwendungen auf niedrigeren Berechtigungsstufen können grundsätzlich keine
Mitteilungen an Anwendungen auf höheren Berechtigungsstufen senden, sofern
die Anwendung der höheren Berechtigungsstufe dies nicht ausdrücklich durch
Aufruf von ChangeWindowMessageFilter() erlaubt. Gleichermaßen können
Anwendungen mit niedrigeren Berechtigungsstufen ein HWND einer Anwendung mit
einer höheren Berechtigungsstufe zwar lesen, aber nicht modifizieren. Aus
Kompatibilitätsgründen geben SendMessage und andere APIs eine Erfolgsmeldung
zurück, auch wenn die API aufgrund von Berechtigungsproblemen blockiert
wurde. Wenn die Kompatibilitätsauswirkung hoch und das Sicherheitsrisiko
gering ist, dürfen auch Anwendungen mit niedriger Berechtigungsstufe in
einigen Fällen unaufgefordert Meldungen an Anwendungen mit höheren
Berechtigungsstufen senden.
Wenn meine Anwendung ein WM_GETTEXT sendet warm wird es dann nicht aufgelöst.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz