Kontextmenü-Eintrag hinzufügen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@edel & @Scarabol
Wirklich verschieben? Na dann, lets go... :lol:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

THX!

@edel
Na dann mal los, helf mal bitte dem Anfänger hier :D

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Eigentlich war das nur nen Witz, aber na gut ...


Hier mal die Funktion die ich genutzt habe :

Code: Alles auswählen

Procedure InjectDll(hProcess)
  
  If Not hProcess
  	ProcedureReturn 0
  EndIf 	
  
  hKernel32    = GetModuleHandle_("Kernel32")
  szLibPath.s  = GetCurrentDirectory() + "popmenu.dll"
  bLen 			= Len(szLibPath)+1
  pLibRemote   = VirtualAllocEx_(hProcess,#Null,bLen,#MEM_COMMIT,#PAGE_READWRITE )
  
  If pLibRemote = #Null
    ProcedureReturn #False
  EndIf
   
  WriteProcessMemory_(hProcess,pLibRemote,@szLibPath,bLen,#Null)
  hThread = CreateRemoteThread_(hProcess,#Null,0,GetProcAddress_(hKernel32,"LoadLibraryA"),pLibRemote,0,#Null)
  
  If (hThread = #Null)
    Goto Jump2
  EndIf
  
  WaitForSingleObject_(hThread,#INFINITE)
  CloseHandle_(hThread)
  VirtualFreeEx_(hProcess,pLibRemote,bLen,#MEM_RELEASE)
  ProcedureReturn 1  
  
  Jump2:
  VirtualFreeEx_(hProcess,pLibRemote,bLen,#MEM_RELEASE)
  
  ProcedureReturn 0  
EndProcedure 

pid = GetPID("purebasic.exe")
If pid
	hProcess  = OpenProcess_(#PROCESS_CREATE_THREAD | #PROCESS_QUERY_INFORMATION | #PROCESS_VM_OPERATION | #PROCESS_VM_WRITE | #PROCESS_VM_READ,#False, pid)
	InjectDll(hProcess)
EndIf

die DLL koennte so aussehen :

Code: Alles auswählen

Procedure _subclass_cb_(hWnd,uMsg,wParam,lParam)
   
   If uMsg = #WM_INITMENUPOPUP
      ; menu bearbeiten ...
      
   EndIf 
  
   ProcedureReturn   callfunctionfast(oldproc,hWnd,uMsg,wParam,lParam) 
EndProcedure   

ProcedureDLL AttachProcess(Instanz)
   
   ; find window handle
   ; subclass window
   ; bla bla 
      
EndProcedure
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Danke!

:allright:

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

edel hat geschrieben:Eigentlich war das nur nen Witz, aber na gut ...
Daher habe ich ja nochmal gefragt...
RSBasic hat geschrieben:Wirklich verschieben?
:lol:
Naja, das Problem wurde sowieso behoben :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Ne noch nich ganz muss nur erstma den Code kapieren...

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Irgendwas funzt da nicht...

hier meine Version von GetPID():

Code: Alles auswählen

Procedure GetPID(Name$)
  Protected proc
  
  GetWindowThreadProcessId_(FindWindow_(0, Name$), proc)
  
  ProcedureReturn proc
  
EndProcedure
hier mal meine dll:

Code: Alles auswählen


Procedure _subclass_cb_(hWnd,uMsg,wParam,lParam)
   
   If uMsg = #WM_INITMENUPOPUP
      ; menu bearbeiten ...
      
   EndIf
 
   ProcedureReturn   CallFunctionFast(oldproc,hWnd,uMsg,wParam,lParam)
EndProcedure   

ProcedureDLL AttachProcess(Instanz)
   
   ; find window handle
   ; subclass window
   ; bla bla
   
   MessageRequester("Info", "Dies ist ein test")
   
EndProcedure 
Wieso wird der requester nicht angezeigt?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Lies dir doch bitte noch einmal die Dokumentation zu GetWindowThreadProcessId durch.
Dann siehst du auch was du da falsch machst ;)
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Keine Ahnung,

was du meintest aber ich hab unten im Code nicht das Fenster angegeben, sondern den Prozessnamen :oops:

Wie ermittelst du die ProzessID?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Oh, ich dachte die Funktion wuerde oben stehen ...

Code: Alles auswählen

Procedure GetPID(ProcessName.s) 
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)
  
  If hSnapShot
    
    iResult = -1
    pInfo.PROCESSENTRY32
    pInfo\dwsize    = SizeOf(PROCESSENTRY32) 
    bProcAvailable  = Process32First_(hSnapShot, @pInfo)
    
    While(bProcAvailable) And (Not iResult = 0) 
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1)  
    Wend
    
    CloseHandle_(hSnapShot)
    
    ProcedureReturn pInfo\th32ProcessID
    
  EndIf 
EndProcedure
GetWindowThreadProcessId verlang nach einem Zeiger.
Richtig waere es also so :

Code: Alles auswählen

GetWindowThreadProcessId_(FindWindow_(0, Name$),@proc) 
Antworten