घर
Top.Mail.Ru Yandeks.Metrika
मंच: "अन्य";
वर्तमान संग्रह: 2017.10.01;
डाउनलोड करें: [xml.tar.bz2];

नीचे

VCL गहराई इसी तरह की शाखाएँ खोजें


Pavia ©   (2016-06-11 09:36) [0]

सभी मानक घटकों के लिए एक बार ऑनक्लिक घटना को कैसे बदलें? यह कहे बिना जाता है कि आप घटकों को फिर से नहीं लिख सकते, लेकिन आप VCL को संपादित कर सकते हैं।



K-1000 ©   (2016-06-11 09:40) [1]

लूप में एक और ईवेंट असाइन करें।
यह निरीक्षक के माध्यम से संभव है।



K-1000 ©   (2016-06-11 09:41) [2]


> यह कहे बिना जाता है कि घटकों को फिर से लिखा गया है
> आप नहीं कर सकते, लेकिन आप VCL को संपादित कर सकते हैं।


यह कैसे हो सकता है?
यदि घटक वीसीएल हैं? :)



Игорь Шевченко ©   (2016-06-11 10:03) [3]

जीन पूल को न छूएं, संक्रमण!



Юрий Зотов ©   (2016-06-11 10:11) [4]

Application.OnMessage।

और गहराई को फिर से लिखना इसके लायक नहीं है।



Leonid Troyanovsky ©   (2016-06-11 10:39) [5]


> पाविया © (11.06.16 09: 36)

> लेकिन आप VCL को संपादित कर सकते हैं।

[3] + 100500

इसे भी देखें: http://rsdn.ru/forum/delphi/480838.1

--
सादर, LVT



Юрий Зотов ©   (2016-06-12 08:52) [6]

> Application.OnMessage।

इससे भी बेहतर एक माउस हुक है (यह देखते हुए कि आकृति मोडल हो सकती है)।

किसी भी मामले में, मुख्य बात गहराई को छूना नहीं है। हमारे बिना भी कीड़े हैं।



Leonid Troyanovsky ©   (2016-06-12 08:58) [7]


> यूरी जोतोव © (12.06.16 08: 52) [6]

> इससे भी बेहतर - माउस हुक

एक क्लिक एक क्लस्टर हो सकता है।
फिर WH_GETMESSAGE या WH_CALLWNDPROC *

--
सादर, LVT



Leonid Troyanovsky ©   (2016-06-12 10:50) [8]


> लियोनिद ट्रायोनोव्स्की © (11.06.16 10: 39) [5]

इस प्रक्रिया को OnClick के साथ नियंत्रणों की सूची भरने की प्रक्रिया दी गई है।
जनक पर झूठ बोलना।
का उपयोग करता है typinfo; प्रक्रिया EnumControls (AControl: TControl; सूची: TStrings); वर i: लॉन्गिंट; pi: PPropInfo; ओंक: TNotifyEvent; शुरू करना pi: = GetPropInfo (AControl, "OnClick"); अगर असाइन किया गया (pi) तो शुरू करना onc: = TNotifyEvent (GetMethodProp (AControl, pi)); अगर सौंपा (onc) तो List.Add (AControl.Name); अंत; यदि AControl TWincontrol है तो i: = 0 से TWINControl (AControl) .ControlCount -1 करें EnumControls (TWinControl (AControl) .Controls [i], सूची); अंत;
उदाहरण के लिए, फार्म पर:
प्रक्रिया TForm1.Button1 क्लिक करें (प्रेषक: TObject); शुरू करना EnumControls (स्वयं, ListBox1.Items); अंत;
--
सादर, LVT



Leonid Troyanovsky ©   (2016-06-13 09:59) [9]


> लियोनिद ट्रायोनोव्स्की © (12.06.16 10: 50) [8]

और यहाँ OnClick के लिए कार्यान्वयन की प्रक्रिया है।
का उपयोग करता है typinfo; टाइप पीएमथोड = ^ टीएमथोड; प्रक्रिया CommonClick (पुराना: PMethod; प्रेषक: Tobject); शुरू करना आउटपुटडबगस्ट्रिंग ("चलो!"); TNotifyEvent (पुराना ^) (प्रेषक); अंत; प्रक्रिया SetControlsCommonClick (AControl: TControl); वर i: लॉन्गिंट; pi: PPropInfo; ओंक: टीएमथोड; पुराना: पीएमथोड; शुरू करना pi: = GetPropInfo (AControl, "OnClick"); अगर असाइन किया गया (pi) तो शुरू करना onc: = GetMethodProp (AControl, pi); if (onc.Data <> nil) या (onc.Code <> nil) तब शुरू करना नया (पुराना); पुराना ^: = ओंक; onDData: = पुराना; onCCode: = @Common क्लिक करें; सेटमेथोडप्रॉप (AControl, pi, onc); अंत; अंत; यदि AControl TWincontrol है तो i: = 0 से TWINControl (AControl) .ControlCount -1 करें SetControlsCommonClick (TWinControl (AControl) .Controls [i]); अंत;
--
सादर, LVT



Rouse_ ©   (2016-06-14 11:15) [10]

तब टीसीटोनोल से डायनामिक क्लिक को इंटरसेप्ट करना आसान होता है



Leonid Troyanovsky ©   (2016-06-15 10:31) [11]


> Rouse_ © (14.06.16 11: 15) [10]

> तब TControl से डायनामिक क्लिक को इंटरसेप्ट करना आसान है

मैंने कोशिश की।
DMT का विवरण लिया
http://www.transl-gunsmoker.ru/2011/07/hack-9-dynamic-method-table-structure.html

मुझे अपने उत्तराधिकारी पर क्लिक इंडेक्स मिलता है
टाइप TMyControl = वर्ग (TControl) सार्वजनिक प्रक्रिया क्लिक करें; ओवरराइड; अंत; प्रक्रिया TMyControl.Click; शुरू करना विरासत में मिला; अंत;
द्वारा
फ़ंक्शन FindDynamicMethod (AClass: TClass; DMTIndex: TDMTIndex): सूचक; // System.GetDynaMethod subroutine के तेज़ BASM संस्करण का पास्कल संस्करण वर डीएमटी: पीडीएमटी; DmtMethods: PDmtMethods; i: पूर्णांक; शुरू करना जबकि निरुपित (AClass) करते हैं शुरू करना Dmt: = GetDmt (AClass); यदि असाइन किया गया (Dmt) तो i: = 0 से Dmt.Count-1 करते हैं अगर DMTIndex = Dmt शुरू करना DmtMethods: = @ Dmt.Indयाम [Dmt.Count]; परिणाम: = DmtMethods [i]; बाहर निकलें; अंत; // इस वर्ग में नहीं - पदानुक्रम ऊपर जाएं AClass: = AClass.ClassParent; अंत; परिणाम: = नील; अंत;
मेरे D6 पर यह -21 निकला।
मैं बिल्लियों पर कोशिश करता हूं:
वर oldproc: TClickproc; प्रक्रिया न्यूक्लिक (ASelf: TObject; प्रेषक: TObject); शुरू करना आउटपुटडबगस्ट्रिंग ("ऑच"); oldproc (aself, प्रेषक); अंत; प्रक्रिया TForm1.Button2 क्लिक करें (प्रेषक: TObject); शुरू करना oldproc: = FindDynamicMethod (TControl; -21); newclick (स्व, Button3); अंत;
अंत में, मैं FindDynamicMethod से संशोधन प्रक्रिया करता हूं:
प्रक्रिया प्रतिस्थापन डायनामिकमेथोड (AClass: TClass; DMTIndex: TDMTIndex; newmethod: Pointer);
था
डीएमटी: पीडीएमटी;
DmtMethods: PDmtMethods;
i: पूर्णांक;
रक्षा: तलवार;
शुरू करना
जबकि निरुपित (AClass) करते हैं
शुरू करना
Dmt: = GetDmt (AClass);
यदि असाइन किया गया (Dmt) तो
i: = 0 से Dmt.Count-1 करते हैं
अगर DMTIndex = Dmt
शुरू करना
DmtMethods: = @ Dmt.Indयाम [Dmt.Count];
Win32Check (VirtualProtect (@DmtMethods [i], 4, PAGE_READWRITE, रक्षा));
DmtMethods [i]: = newmethod;
VirtualProtect (@DmtMethods [i], 4, रक्षा, सुरक्षा);
बाहर निकलें;
अंत;
// इस वर्ग में नहीं - पदानुक्रम ऊपर जाएं
AClass: = AClass.ClassParent;
अंत;
अंत;
अंत में, मैं रिप्लेसडायनामिकमैथोड (TControl, -21, @newClick) कर रहा हूं।

लेकिन, परिणामस्वरूप, मुझे लगता है कि बटन (TButton, TRadioButton, TCheckBox) पर यह काम नहीं करता है।
जाहिर है, सब कुछ इतना सरल नहीं है। कम से कम मेरे लिए :)

मुझे नहीं पता कि मेरे साथ क्या गलत है, लेकिन यह पहले से ही स्पष्ट है कि क्या करना है
मान लीजिए कि यह dll से बाहर काम करने की संभावना नहीं है।

--
सादर, LVT



Leonid Troyanovsky ©   (2016-06-15 10:42) [12]


> लियोनिद ट्रायोनोव्स्की © (15.06.16 10: 31) [11]

फ़ंक्शन द्वारा खोजें FindDynamicMethod (AClass: TClass; DMTIndex:

प्रक्रिया द्वारा DumpDynamicMethods, क्षमा करें।

--
सादर, LVT



Rouse_ ©   (2016-06-15 12:43) [13]


> लियोनिद ट्रायोनोव्स्की © (15.06.16 10: 42) [12]

क्यों इस तरह की कठिनाइयाँ - एक गंदा हैक और सभी चीजें :)

टाइप TForm7 = वर्ग (TForm) Button1: TButton; Button2: TButton; प्रक्रिया फॉर्म क्रिएट (प्रेषक: TObject); अंत; वर Form7: TForm7; कार्यान्वयन का उपयोग करता है SpliceHelper; {$ R * .dfm} प्रक्रिया ClickHandler (स्व, प्रेषक: Tobject); शुरू करना ShowMessage (स्वयं TComponent के रूप में)। नाम + "क्लिक किया"); अंत; प्रक्रिया TForm7.FormCreate (प्रेषक: TObject); फ़ंक्शन GetControlClickAddr: सूचक; एएसएम {$ IFDEF WIN32} lea eax, TControl.Click {$ ELSE} lea rax, TControl.Click {$ ENDIF} अंत; वर HotPathSpliceRec: THotPachSpliceData; OldProtect: DWORD; ट्रम्पोलिनप्लाइस: TNearJmpSpliceRec; TrampolineAddr, ClickHandlerAddr: सूचक; शुरू करना ClickHandlerAddr: = @ClickHandler; HotPathSpliceRec.FuncAddr: = GetControlClickAddr; हटो (HotPathSpliceRec.FuncAddr ^, HotPathSpliceRec.LockJmp, LockJmpOpcodeSize); HotPathSpliceRec.SpliceRec.JmpOpcode: = JMP_OPKODE; HotPathSpliceRec.SpliceRec.Offset: = PAnsiChar (ClickHandlerAddr) - PAnsiChar (HotPathSpliceRec.FuncAddr); SpliceNearJmp (PAnsiChar (HotPathSpliceRec.FuncAddr) - NearJmpSpliceRecSize, HotPathSpliceRec.SpliceRec); SpliceLockJmp (HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODR); अंत;

SpliceHelper.pas यहाँ है:
http://rouse.drkb.ru/blog/intercept2.zip



Rouse_ ©   (2016-06-15 13:18) [14]

यहां तक ​​कि सब कुछ फेंग शुई था :)

टाइप TForm7 = वर्ग (TForm) Button1: TButton; Button2: TButton; ActionList1: TActionList; Action1: प्रादेशिक सेना; प्रक्रिया फॉर्म क्रिएट (प्रेषक: TObject); प्रक्रिया Button1Click (प्रेषक: Tobject); प्रक्रिया Action1Execute (प्रेषक: TObject); अंत; वर Form7: TForm7; कार्यान्वयन का उपयोग करता है SpliceHelper; {$ R * .dfm} टाइप TControlFriendly = वर्ग (TControl); प्रक्रिया ClickHandler (स्व: Tobject); वर AControl: TControlFriendly; शुरू करना AControl: = TControlFriendly (स्व); ShowMessage (AControl.Name + "पर क्लिक किया"); अगर असाइन किया गया (AControl.OnClick) और (AControl.Action <> nil) और नहीं DelegatesEqual (@ AControl.OnClick, @ AControl.Action.OnExecute) तब AControl.OnClick (स्व) और नहीं तो (AControl.ComponentState में csDesigning) और (AControl.ActionLink <> गिल) तो AControl.ActionLink.Execute (TComponent (Self)) और यदि असाइन किया गया (AControl.OnClick) तो AControl.OnClick (स्व); अंत; प्रक्रिया TForm7.Action1Execute (प्रेषक: TObject); शुरू करना ShowMessage (प्रेषक के रूप में TComponent) .नाम + "क्लिक किया हुआ 2"); अंत; प्रक्रिया TForm7.Button1 क्लिक करें (प्रेषक: TObject); शुरू करना ShowMessage (प्रेषक के रूप में TComponent) .नाम + "क्लिक किया हुआ 2"); अंत; प्रक्रिया TForm7.FormCreate (प्रेषक: TObject); फ़ंक्शन GetControlClickAddr: सूचक; एएसएम {$ IFDEF WIN32} lea eax, TControl.Click {$ ELSE} lea rax, TControl.Click {$ ENDIF} अंत; वर ClickHandlerAddr: सूचक; HotPathSpliceRec: THotPachSpliceData; शुरू करना ClickHandlerAddr: = @ClickHandler; HotPathSpliceRec.FuncAddr: = GetControlClickAddr; हटो (HotPathSpliceRec.FuncAddr ^, HotPathSpliceRec.LockJmp, LockJmpOpcodeSize); HotPathSpliceRec.SpliceRec.JmpOpcode: = JMP_OPKODE; HotPathSpliceRec.SpliceRec.Offset: = PAnsiChar (ClickHandlerAddr) - PAnsiChar (HotPathSpliceRec.FuncAddr); SpliceNearJmp (PAnsiChar (HotPathSpliceRec.FuncAddr) - NearJmpSpliceRecSize, HotPathSpliceRec.SpliceRec); SpliceLockJmp (HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODR); अंत;



Юрий Зотов ©   (2016-06-15 13:56) [15]

टाइप TMyLabel = वर्ग (TLabel) संरक्षित प्रक्रिया क्लिक करें; ओवरराइड; अंत; प्रक्रिया TMyLabel.Click; शुरू करना शो मेसेज ("वाह!"); अंत;

Rozych, इस संदेश पर क्लिक करने पर मैं क्या संदेश (आपका या मेरा) देखूंगा?



Rouse_ ©   (2016-06-15 14:00) [16]

Mdya ... आपका :)



Юрий Зотов ©   (2016-06-15 14:11) [17]

> Rouse_ © (15.06.16 14: 00) [16]

ट्रिक यह है कि आपने जिस क्लिक को हैक किया है उसे नहीं कहा जाता है। इसलिए, आपको परियोजना में उपयोग किए जाने वाले सभी नियंत्रणों से गुजरने और अपनी हैक को सभी पर लागू करने की आवश्यकता है।

आप शायद कर सकते हैं, लेकिन अधिक बवासीर होंगे।



Rouse_ ©   (2016-06-15 14:25) [18]

हाँ, जानवर बल को ऐसे मामलों के लिए करना होगा + नए गैर-मानक नियंत्रण के निर्माण को नियंत्रित करें (क्लिक बंद के साथ)



Юрий Зотов ©   (2016-06-15 14:29) [19]

> Rouse_ © (15.06.16 14: 25) [18]
> अतिव्यापी क्लिक के साथ नियंत्रण के निर्माण को नियंत्रित करें


जरूरी नहीं है। यदि क्लिक अवरुद्ध नहीं है, तो पूर्वज में यह बस फिर से हैक होता है। डरावना नहीं है।



Юрий Зотов ©   (2016-06-15 14:33) [20]

वैसे, एक और दिलचस्प काम रन-टाइम में परियोजना में उपयोग किए जाने वाले सभी वर्गों की एक सूची प्राप्त करना है। वंशानुक्रम के वृक्ष के रूप में वांछनीय है।



DayGaykin ©   (2016-06-15 15:40) [21]

मुझे यह समस्या है:
स्टैक पर एक क्लास को तुरंत कैसे करें?
(C ++ के समान)।



Eraser ©   (2016-06-15 16:06) [22]


> यूरी जोतोव © (15.06.16 14: 33) [20]

वर LContext: TRttiContext; LType: TRttiType; शुरू करना {RTTI संदर्भ प्राप्त करें} LContext: = TRttiContext.Create; {आवेदन में घोषित सभी प्रकारों की गणना करें} LContext.GetTypes में LType के लिए () करें OutputDebugString (PChar (LType.Name)); LContext.Free;
संदर्भ से)



NoUser ©   (2016-06-15 18:56) [23]

> DayGaykin © (15.06.16 15: 40) [21]

प्रक्रिया Test2;
// कास्ट
// cl = TTest.InstanceSize;
था
// a: सरणी [बाइट का 1..cl];
t: TTest;
शुरू करना
// t: = @a;
t: = StackAlloc (TTest.InstanceSize);

TTest.InitInstance (t);

अंत;

नहीं? और StackAlloc को यहाँ ले जाया जा सकता है http://sourceforge.net/projects/graphics32/files/graphics32/))



DayGaykin ©   (2016-06-15 20:27) [24]


> StackAlloc को यहाँ ले जाया जा सकता है http://sourceforge.net/projects/graphics32/files/graphics32/
>))
>
>

या यों कहें।
यह मेरे लिए अभी तक स्पष्ट नहीं है कि समारोह से बाहर निकलते समय कौन स्टैक को मुक्त करेगा।



NoUser ©   (2016-06-15 21:13) [25]

GR32_LowLevel.pas -> StackFree (t);

पुनश्च, वहाँ 64bit asm में यह ठीक है, लेकिन एक त्रुटि प्रतीत होता है।



Leonid Troyanovsky ©   (2016-06-16 12:05) [26]


> लियोनिद ट्रायोनोव्स्की © (15.06.16 10: 31) [11]

> लेकिन, परिणामस्वरूप, मुझे बटन (TButton, TRadioButton) पर मिलता है,
> TCheckBox) यह काम नहीं करता है।

यह TRadioButton, और TButton के लिए एक नई प्रक्रिया पर काम करता है
आपको ऐसा करने की आवश्यकता है (TButton.Click के समान) कुछ इस तरह:
टाइप TClickproc = प्रक्रिया (ASelf: TObject); वर oldproc: TClickproc; प्रक्रिया TControlClick (ASelf: TObject); वर s: स्ट्रिंग; शुरू करना oldproc (aself); s: = "control" + TComponent (ASelf) .Name; OutputDebugString (PChar (s)); अंत; प्रक्रिया TButtonClick (ASelf: TObject); वर प्रपत्र: TCustomForm; शुरू करना प्रपत्र: = गेटपार्टफ़ॉर्म (टीसीओंट्रोल (एएसएफएल)); अगर फॉर्म <> शून्य है तो फॉर्म। मोडलResult: = TButton (ASelf) ।ModalResult; TControlClick (ASelf); अंत;
तो
oldproc: = FindDynamicMethod (TControl; -21); रिप्लेडिमोनॉमिकमैथोड (TControl; -21, @TControlClick); रिप्लेडिमोनॉमिकमैथोड (TButton; -21, @TButtonClick);
TCheckBox के लिए, मैं पहले से ही इसे तोड़ रहा हूं।

जो लोग व्यायाम करना चाहते हैं, उनके लिए मैं पूरी यूनिट लगा सकता हूं।

--
सादर, LVT



Leonid Troyanovsky ©   (2016-06-16 12:38) [27]


> Rouse_ © (15.06.16 12: 43) [13]

एक हेलिकॉप्टर से, एक टैंक - यह सब अप्रमाणिक है;)

--
सादर, LVT



Rouse_ ©   (2016-06-16 17:35) [28]


> लियोनिद ट्रायोनोव्स्की © (16.06.16 12: 38) [27]
> एक हेलिकॉप्टर से, एक टैंक - यह सब अप्रमाणिक है;)

यह कार्य पर निर्भर करता है :) कभी-कभी बंदूक से मक्खी को मारना आसान होता है :)



पन्ने: 1 पूरी शाखा

मंच: "अन्य";
वर्तमान संग्रह: 2017.10.01;
डाउनलोड करें: [xml.tar.bz2];

ऊपर





मेमोरी: 0.68 एमबी
समय: 0.024 c
3-1314608477
Tsukor5
2011-08-29 13:01
2017.10.01
गिनती (तालिका। *)


15-1465914259
pavel_guzhanov
2016-06-14 17:24
2017.10.01
फ्लैश ड्राइव के बारे में सवाल


2-1446543628
Gedevan
2015-11-03 12:40
2017.10.01
प्रोग्राम को प्रपत्र Oncreate ईवेंट कैसे असाइन करें?


2-1446719068
एवगेनी मेदवेदेव
2015-11-05 13:24
2017.10.01
निष्पादन योग्य होने पर त्रुटि


4-1283746765
स्पेलर
2010-09-06 08:19
2017.10.01
यह कैसे निर्धारित करें कि एक कार्यक्रम RemoteApp मोड में चल रहा है?





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский