PDA

Tam Sürümünü Görmek İçin : Herhangibir pencerenin ekranda gezdirilmesini kısıtlamak için c++ codu veya utilitiy


Tim
25/04/2005, 04:22
ismiyle cagıracagım bir pencerenin ekranda saga sola hareket etirilmesini kısıtlamak istiyorum yani pencere acılacak ve aktif olacak (yani içindekilerin calısması aksamıyacak) ancak mouse ile pencerenin konumu ve boyutu değiştiirilemiyecek bu işlemi gerceklestircek Microsoft Visual Studio .NET 2003 ile derleyebıleceğim çalısan denenmiş bir script gerekiyor.yada bu olayı yaptırabılecek bir utility.win98 ve xp yi desteklemeli.


Katkıda bulunmak isteyen programcı arkadasların acil yardımını bekliyorum.


wLy
25/04/2005, 12:48
VC++'da form'un onMove events'ina return false; koymanız yeterli..

Tim
25/04/2005, 16:19
tesekkurler demek istediğim tam olarak su o anda calısan bir exe'nın penceresine bunu nasıl uygulatacam.yani ismi dolap.exe olan bir program dolap baslıklı bir arayuz yaratıyor. bunun hareket etmesini istemiyorum.bu dolap isimli pencereyi ismiyle nasıl c++ dan cagırıp üzerinde pencere hakimiyeti kurabılirım.

wLy
25/04/2005, 16:56
hmm. bu program sizin yaptıgınız program değil anladığım kadarıyla.
Eğer Form'lara ulasmak istiyorsanız emin değilim ama programı yazan kişi mutlaka frmprotect koymuştur ben şahsen koyuyorum..

Tim
27/04/2005, 04:34
Bu olayı c++ da cozmek sart değil bu iş için yapılmıs bir utility de olabılır ben bir tane buldum ancak win98 desteği yok ve pencerenin içindekileride etkisiz hale getiriyor.bu yuzden onu kullanmak istemiyorum.

daha once değim gibi calısan bir programın penceresini ekranda saga sola hareket etirilmesini kısıtlamak istiyorum

işimi görmeyen utility nin adresi bu
http://www.commandline.co.uk/cmdow/index.html

kısaca yardımınıza muhtacım arkdaslar bir bilen el atsın lütfen.sizinde bu çorbada tuzunuz bulunsun.

tüm bu ugras uzerinde calıstıgım ulluslararası bir oyun projesinin cd menusu için.projeme göz atmak isteyen kotf.com gezebilir.

Sabahi
29/04/2005, 04:59
Bu isin en kolay cozumu pencerenin style ozelliklerini degistirmek. Bu yontemde tek sorun window un ust kismindaki window title, minimize, maximize dugmeleri olan kisim ortadan kaybolacaktir. Nedeni malum windowun saga sola hareket etmesini sagliyan bu border ve bunu yok etmeden saga sola hareket etmeyi onlemenin yolu,
1) Programin kaynak kodunu degistirmek ki anladigim kadari ile mumkun degil
2) Subclassing ( yani soz konusu pencerenin window procedure unu kendi yazdigimiz bir window procedure ile degistirmek) ki en saglikli cozum olmakla beraber oldukca zahmetli.
3) Hooking ( yani bu pencereye giden window mesajlarini daha pencereye ulasmadan ele gecirip WM_MOVE, WM_SIZE gibi mesajlari engellemek)

Ben isin kolayina kacip bos bir Notepad Window unun saga sola tasinmasini, kucultulup buyultulmesini engelleyen cok basit bir programi MS VS 6.0 da C++ ile derledim. Test etmek isterseniz basit bir Win32 projesi yaratip asagidaki kodlari kopyalin ve FindWindow fonksiyonundaki "Untitled - Notepad" yerine sizin hedeflediginiz window un ismini yazin ve derleyin. Hedeflediginiz pencereyi acin ve bu programi calistirin. Isinizi gorecek gibi ise biraz elden gecirip gonul rahatligi ile kullanabilirsiniz.

Not: Denemedigim icin emin degilim ama yanilmiyorsam bu program sadece top-level window larla calisacaktir eger sizin hedeflediginiz window top-level degilse once parent window bulunup bu window un child window larini traverse etmek gerekebilir.


#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

HWND hwndTarget = FindWindow(NULL, "Untitled - Notepad");

if(hwndTarget)
{

DWORD dwStyle = ::GetWindowLong(hwndTarget, GWL_STYLE);
dwStyle &= ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX |
WS_THICKFRAME | WS_BORDER);
SetWindowLong(hwndTarget, GWL_STYLE, dwStyle);
}else
{
::MessageBox (NULL, "Window not found!", "Alert", 0);
}

return 0;
}

Sabahi
28/05/2005, 06:26
Ilisikteki zip dosyasini acarsan executable halini elde edeceksin. Hedefledigin pencerenin ismini tam olarak bilmedigim icin basit bir dialog box koydum. Dialog boxtaki text box default olarak Untitled - Notepad yazili olarak gelecek ama sen bunu silip istedigin pencerenin ismini yazabilirsin. Daha oncede bahsettigim gibi butun top level windowlarla calismasi lazim ama senin amacladigin window top level degilse bile caresi kolay. Minesweeper, Notepad v.s. gibi bir kac program ile dene eger isine yarayacaksa programi bir background process olarak degistirir ve birde hook dll ekleriz boylece her defasinda elle calistirmaya gerek kalmaz.

Tim
28/05/2005, 17:28
ok çok sagol denedim fakat bu yontem işe yaramadı çunku benim sabıtlemeye calıstıgım pencerenin zaten üst kısmı yok.Bu durumda ne yapabılırız peki.ve bana msn den ulasırsan daha memnun olur.um boyle zor oluyor.sonucu gene foruma yazarız

Sabahi
28/05/2005, 23:38
Aradaki saat farkindan dolayi MSN de gorusmemiz pek kolay olmaz. Gerci gorussekte daha once yazdiklarimin disinda ekliyebilecegim pek bir sey yok. Bu noktada yapman gereken dolap penceresine giden butun window mesajlarinin arasina girip istemedigin mesajlarin ulasmasini engellemen. Bunu yapabilmen icin kullandigin programlama dilinin onemi yok ama dll yapmak ve Win32 Api ile programlama yapmak gibi konulara hakim olman lazim. Yukarida .NET Studio kullandigini yazmissin .NET ile Win32 api programming diye bir arama yap internette eminim yardimci olacak bir suru kaynak bulacaksindir.

Tim
29/05/2005, 00:16
bu konuyu netde cok arastırdım onlarca deneme yaptım fakat sonuc alamadım,buraya mesaj atmak son çaremdi .Üzerimde calsıtıgım projenin cok eksigi var ve zamanla yarısıyorum.Bir yandan oyunu yapıyorum bir yandan sitesini bir yandan fragmanını hazırlıyorum.Bu konu üzerinde daha fazla calısamıyacagım için sizlerden yardım istedim.Dediğin gibi herhangibir dilde yapılabılır bunu birisi sevabına yapsa cok iyi olurdu.Bu projeyle ülkemizi tanıtacaz.Şuanda projem 60 farklı ulkedeki oyun severler tarafından takıp ediliyor bu bir starwars oyunu.

Bahsi gecen yaptıgım menu systeminin resimleride bunlar
http://moddb.com/images/cache/mods/33/3344/gallery/water_24865.jpg
http://moddb.com/images/cache/mods/33/3344/gallery/water_25148.jpg

Projem hakkında bilgi almak isteynler www.kotf.com adresine bakabılır.

Cekici
29/05/2005, 00:19
duymuştum bulabilirsem mailine atarım...

Sabahi
29/05/2005, 00:53
Eger soz konusu dolap.exe yi buraya post yaparsan ve biraz daha detay verirsen (mesela pencere ilk acildigi yere mi sabitenecek yoksa ekranda herhangi bir noktaya tasinip oraya mi sabitlenecek gibi) bos vakitlerimde uzerinde calisabilirim. Fakat onumuzdeki bir ay icerisinde hic vaktim yok. Ondan sonrasi allah kerim. Birde .NET kullaniyorsan yazdigin programlar architecture independent demektir benim onerdigim cozumun windows OS disinda calismasi mumkun degil.

Tim
29/05/2005, 04:11
http://aslan2.dnskaliteweb.net/~tim/denem.rar

çalıstırılacak dosyanın ismi menu0.exe
diğer dosyalar menünün işlevi için gerekli utility'ler.

örnek dosya için açıklama
iki menumuz var bunlardan birinin ismi "OYUN"= menu0.exe digerinin ismide "BOLUMLER" = menu1.exe

(oYUN) menusunden "single player" butonuna basıldıgında script.bat isimli bir dosya cagrılıyor bu .bat dosyası ekranda herhangibir dos penceresi acmadan bir utility yardımıyla gizli olarak calsıyor.dosyasını içerigi şu:


start submenu\menu1.exe
cmdow "OYUN" /DIS
pv -ckf menu0.exe -d"3000" > nul


birinci satırdaki komut: (BOLUMLER) menusunu cagırıyor. bu menu ,(OYUN) menusunu kapatmadan üzerinde cıkıyor.(bir menuden digerine geçerken fade yapması için diğer menuyu hemen kapatırmıyorum)

ikinci satırdaki komut: "single player" butonuna basıldıktan sonra (BOLUMLER) menusu yuklene kadar ekranda gorunen (OYUN) menusunü işlemez hale getiriyor.

üçüncü satırdaki komut: (OYUN) penceresini yaklasık 3 saniye sonra arkada caktırmadan kapatıyor.3 saniye bekletmemizin sebebi (BOLUMLER) menusu acılana kadar (OYUN) menusunun ekranda gorunur olmasını istiyorum.kısaca zaman zaman ekranda iki menu oluyor fakat kullanıcı sadece en uste olanı goruyor yani üsteki pencere hareket etirilirse alttaki menu gorunebılir.bu ihtimali ortadan kaldrımak istiyorum.Bu yuzden bu pencereler acıldıkları andan itibaren ekrana sabitlenmeleri gerekiyor.Bunu menu'yu hazırlayan utility malesef sağlamıyor.Buyuzden bizim dısardan mudahale etmemiz gerekiyor.

kısaca her menuyu cagırdıktan sonra o menunun hareket etmesini engeleyecek, sizin hazırladıgınız exe'yi calıstıracagız bu ornekteki pencere ismileri dediğim gibi "OYUN" VE "BOLUMLER" .Bu sadece olayı kavratabılmem için verdiğim bir ornek.eger sorunu cozen bir arkadas olursa exelerin kaynak kodu üzerinde değişikliler yapacagız pencere ismleri degişecek ayrıca bu olayın hem win98'i hemde winxp mutlaka desteklemesi gerekiyor.

Menu resimleri
http://moddb.com/images/cache/mods/33/3344/gallery/water_24865.jpg
http://moddb.com/images/cache/mods/33/3344/gallery/water_25148.jpg

tüm bunları okuduktan sonra soyle bir soru akla gelebilir.Bukadar kasacagınına daha profesyonel bir menu programı ile niye hazırlamadın menuyu diyebilirsiniz.
fakat bu utilitiy ücretsiz ve pratık bir şekilde sesli,görsel, hos bir menu yapmanızı saglıyor.menu programını cözüp yapmıs bulundum bütün projeyi ben hazırlıyorum artık yapılandan vazgeçmek yeni bir programala ugrasmak istemiyorum vaktim kalmadı.Yardımcı olabilecek arkadaslara şimdiden teşekkurler.Bu işi en geç iki hafta içinde haletmeliyiz.

Sabahi
30/05/2005, 11:05
Ilisikteki exe ile dll dosyalarini ayni klasore koy. Oyun penceresini ac ve anchor.exe yi calistir. Yanilmiyorsam istedigin sonucu alacaksin. Sadece Oyun penceresinden bolumlere gecerken yarim saniye kadar kritik bir nokta var ama simdilik sadece test etmen icin yazdim. Zaten pencere isimlerini degistirecegini soylemistin.O zaman dll dosyasininda degistirilmesi gerekecek nasilsa. Win 98 tede calismasi lazim ama benim deneme imkanim yok artik sen bir 98 bulup test edersin.
Hadi kolay gelsin sana.

Sabahi
30/05/2005, 21:34
Carsamba gunu Turkiyeye dogru yola cikacagim icin bir sure ortalikta olmayacagim. Sizinde aceleniz oldugu icin test yapmanizi beklemeden bir iki degisiklik yaparak bu hali ile kullanabileceginizi dusundum dosyalari tekrar ekliyorum. Butun yapmaniz gereken menu yu calistirir calistirmaz anchor exe yide calistirmaniz. Ve Menu pencere isimlerini oldugu gibi "OYUN" ve "BOLUMLER" olarak birakmaniz.
Size basarilar.

Tim
30/05/2005, 22:04
öncelikle teşekkürler bu kadar çabuk halettiğin için çok sağol evet tam istediğim sey işe yarıyor.Fakat keşke kaynak kodunuda ekde gonderseydın en azından kendim pencere isimlerini değiştirirdim.Pencere isimlerini mutlak değştirmem gerekiyor.Çünku 2 den fazla menu olacak,Eger halen buralardaysanız kaynak kodunu gondermenizi rica ediyorum. pencere isimleri aslen sunlar olacaktı "KNIGHTS OF THE FORCE" VE "KNIGHTS OF THE FORCE " yani isimleri aynı fakat ikinci menünün isminde fazladan bir bosluk karakteri olacak.

Sabahi
30/05/2005, 22:41
/* Asagidaki anchor.exe nin kaynak kodu */


#include <windows.h>
#include "MsgHook.h"

#define UWM_END 0x0400 + 0x100

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case UWM_END:
{
::SendMessage(hwnd, WM_DESTROY, 0, 0);
}break;
case WM_DESTROY:
{
InstallFilterMsgProc(FALSE);
PostQuitMessage(0);
}break;

default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = 0;
wc.hbrBackground = 0;
wc.lpszMenuName = NULL;
wc.lpszClassName = "NoClass";
wc.hIconSm = 0;

if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

hwnd = CreateWindowEx(
0,
"NoClass",
"Anchor",
0,
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0,
NULL, NULL, hInstance, NULL);

if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

DWORD ProcessID = 0;
HWND hWndTarget = ::FindWindow(0, "OYUN");

if (hWndTarget == NULL)
{
MessageBox(NULL, "Target Window not found!", "Alert", 0);
return 0;
}


if (!InitMsgProc (hwnd)) MessageBox(NULL, "Hook Creation Failed!", "Error!",0);
InstallFilterMsgProc(TRUE);


while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}

/* DLL MsgHook.h */


#ifndef _DEFINED_6EB68B5A_AE7B_43a2_9B2B_43EC787C9240
#define _DEFINED_6EB68B5A_AE7B_43a2_9B2B_43EC787C9240

#if _MSC_VER > 1000
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _COMPILE_85FDD92B_7E1D_4981_BDB1_56F515478E46
#define LIBSPEC __declspec(dllexport)
#else
#define LIBSPEC __declspec(dllimport)
#endif

// Add function declarations below.
LIBSPEC void InstallFilterMsgProc (int nCode);
LIBSPEC BOOL InitMsgProc (HWND hWnd);



#undef LIBSPEC
#ifdef __cplusplus
}
#endif

#endif

/* MsgHook.cpp */


#define _COMPILE_85FDD92B_7E1D_4981_BDB1_56F515478E46

// System includes.
#include <windows.h>
#include <fstream.h>
#include <tchar.h>

// Local includes.
#include "MsgHook.h"

// Type definitions
typedef struct TAG_HOOKDATASTRUCT
{
HHOOK hHook;
HINSTANCE hInst;

}HOOKDATASTRUCT;

// Globals
HOOKDATASTRUCT hds;

// User defined Window Messages
#define UWM_END 0x0400 + 0x100


// Shared section
#pragma data_seg(".SHARED")
HWND hWndServer = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.SHARED,rws")


LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSG pmsg;
pmsg = (PMSG)lParam;
HWND hWndOyun = NULL;
HWND hWndBolum = NULL;
HWND hWndTarget = NULL;

if (nCode >= 0)
{
if (nCode == HC_ACTION)
{
hWndOyun = ::FindWindow ( NULL, "OYUN");
hWndBolum = ::FindWindow ( NULL, "BOLUMLER");
if (hWndOyun == NULL && hWndBolum == NULL ) SendMessage(hWndServer, UWM_END, 0, 0);
hWndTarget = ::GetActiveWindow ();

if (hWndBolum == hWndTarget || hWndOyun == hWndTarget)
if(pmsg->hwnd == hWndTarget && pmsg->message == WM_MOUSEMOVE) pmsg->message = 0;
}
}
return CallNextHookEx(hds.hHook, nCode, wParam, lParam );
}

BOOL InitMsgProc(HWND hWnd)
{
if (hWndServer == NULL)
{
hWndServer = hWnd;
hds.hInst = GetModuleHandle("MsgHook.dll");
return TRUE;
}return FALSE;

}

void InstallFilterMsgProc(int nCode)
{

if(nCode)
{
hds.hHook = SetWindowsHookEx(WH_GETMESSAGE , GetMsgProc, hds.hInst, 0);

}else
{
UnhookWindowsHookEx(hds.hHook);

}
}

/* Biraz acele yazdigim icin eminim cok daha iyilestirilebilir ama ise yariyor. Bu arada anchor de dll linking implicit olarak gerceklestiriliyor. Eger ayni sekilde kullanmak istersen ilk once dll dosyasini derle ve derleme sonucunda .lib dosyasi olusacak bu dosyayi anchor projesine eklemen lazim. Tabii MsgHook.h dosyasinida. Eger Menu isimlerini degistireceksen kodda degistirmen gereken tek sey FindWindow cagrilarindaki "OYUN" ve "BOLUMLER" i yenileri ile degistirmen. */

Tim
01/06/2005, 01:58
tekrar teşekkürler