Несколько вопросов
1. Как создать "дочернее" окно и как потом сохранить то, что там ввели в переменную
2. У меня есть окно, а как внутри добавить кнопку или что-то подобное(текст и т.п.)
3. Как в окне вывести время (системное)
4. Как создать ярлыки внутри окна (чтобы при нажатии на ярлык открывался файл, ну как обычно)
5. Как внутри окна создать закладки, при нажатии которых менялись эти ярлыки
6. Как програмно заблокировать ctrl+alt+f4 и ctrl+alt+del
7. Как заблокировать нажатие ctrl+alt+del в blockinput()
8. Почему на других кампах не запускаются мои приложения(про это поподробнее)
1. Как создать "дочернее" окно и как потом сохранить то, что там ввели в переменную
2. У меня есть окно, а как внутри добавить кнопку или что-то подобное(текст и т.п.)
3. Как в окне вывести время (системное)
4. Как создать ярлыки внутри окна (чтобы при нажатии на ярлык открывался файл, ну как обычно)
5. Как внутри окна создать закладки, при нажатии которых менялись эти ярлыки
6. Как програмно заблокировать ctrl+alt+f4 и ctrl+alt+del
7. Как заблокировать нажатие ctrl+alt+del в blockinput()
8. Почему на других кампах не запускаются мои приложения(про это поподробнее)
1. Дочерние и вообще окна создаются при помощи CreateWindow и CreateWindowEx. Вводить можно в окно класса EDIT, чтобы получить что введено нужно послать сообщение WM_GETTEXT
2. CreateWindow, CreateWindowEx. Классы BUTTON, STATIC
3. Получить время, либо встроенными инструментами либо API функцией GetLocalTime.
4. Обрабатывать события входа/выхода мыши в/с клиентской области ярлыка.
8. А разве они должны запускаться?
а как иначе? Как то ж делают программы, другие люди их скачивают, устанавливают, используют. Или С++ - это только для себя???
8. Почему на других кампах не запускаются мои приложения(про это поподробнее)
ты лучше сам расскажи поподробнее, что за приложение. Может оно юзает какие нибудь базы данных или может оно .NET либо может использует какие нибудь DLL которых нет на других машинах
6. Как програмно заблокировать ctrl+alt+f4 и ctrl+alt+del
Можно поставить Hook на ZwCreateThread, а потом проверять, если это taskmng.exe, то получаем его Id, потом вызываем OpenProcess с Id и с флагом TERMINATE_PROCESS, получаем его handle, а потом делаем ему TerminateProcess.
Мне кажется это как вариант вполне подойдёт.
А Alt-Ctr-F4 аналогично, только Hook, наверное, будем ставить на TerminateProcess. Если это наш процесс, то просто не вызываем эту функцию или возвращаем код ошибки.
Как ставить Hook написано в какой-то статье на wasm.ru.
.if reason == DLL_PROCESS_ATTACH
push instance
pop hInstance
call SetGlobalHook
call SetHook
mov eax, TRUE
.elseif reason == DLL_PROCESS_DETACH
call Unhook
.elseif reason == DLL_THREAD_ATTACH
.elseif reason == DLL_THREAD_DETACH
.endif
ret
LibMain endp
invoke CallNextHookEx,0h,dword ptr Code,dword ptr wParam,dword ptr lParam
mov eax,0h
ret
MessageProc endp
SetGlobalHookProc proc
invoke SetWindowsHookEx,WH_GETMESSAGE,offset MessageProc,dword ptr hInstance,0h
.if eax==0h
.else
mov dword ptr hook_handle,eax
.endif
invoke Sleep,INFINITE
ret
SetGlobalHookProc endp
SetGlobalHook proc
local TrId:DWORD
local hMutex:DWORD
invoke CreateMutex,0h,FALSE,$CTA0("SomeString")
.if eax!=0
invoke CreateThread,0h,0h,offset SetGlobalHookProc,0h,0h,addr TrId
.if eax==0h
.else
.endif
invoke CloseHandle,dword ptr hMutex
.endif
ret
SetGlobalHook endp
CreateMutex нужен, чтоб поставить Hook 1 раз.
В чём вся штука:
Если поставить такой Hook:
invoke SetWindowsHookEx,WH_GETMESSAGE,offset MessageProc,dword ptr hInstance,0h
То наша Dll будет прилепляться ко всем процессам с окнами, т.е. с PeekMessage и DispatchMessage.
Она будет получать DLL_PROCESS_ATTACH, после чего мы делаем перехват вышеприведённых функций, например, методом сплайсинга...
P.S.
Напиши как кнопки в окнах делать без MFC, если понял как...
Только не говори что ТАКОЙ код ты смог написать, а кнопку сделать не можешь?!
Почему-то об этом мало пишут или мне не попадается.
Мне 1 раз попалась книжка C++ для чайников. Вот там это было всё очень хорошо описано. Но только автора забыл и ничего похожего не нашёл ни в сети, ни в книжном магазине.
Да собственно, как-то я этим и не занимался слишком упорно...
Так не нашёл, отвлёкся, занялся чем-то другим и всё...
Спрашивал у друзей-программистов, а они сами не знают. Говорят, что да нафиг надо, лучше в Delphi или в Visual Studio 2005 всё графически нарисовать и всё... А кто-то вообщё на C# пересел и говорит, что в гробу видел теперь WinAPI.
Вот так... руки не доходят...
Вот я пытался кнопочку нарисовать хотя бы, но что-то пока не получилось... Как-то неправильно она рисуется...
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include E:\masm32\include\windows.inc
include E:\masm32\include\kernel32.inc
include E:\masm32\include\user32.inc
include E:\masm32\include\advapi32.inc
include E:\masm32\include\gdi32.inc
includelib E:\masm32\lib\kernel32.lib
includelib E:\masm32\lib\user32.lib
includelib E:\masm32\lib\advapi32.lib
includelib E:\masm32\lib\gdi32.lib
include E:\masm32\macros\Strings.mac
.DATA
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "Win32 assembly is great and easy!",0
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR,
CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, \
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke DrawText,dword ptr hdc,$CTA0("String",szStr),sizeof szStr-1,addr rect,DT_CENTER
lea esi,rect
assume esi:ptr RECT
mov dword ptr [esi].left,020h
mov dword ptr [esi].top,020h
mov dword ptr [esi].right,060h
mov dword ptr [esi].bottom,040h
assume esi:nothing
invoke DrawFrameControl,dword ptr hdc,addr rect,DFC_BUTTON,0h
.if eax==0h
invoke MessageBox,0h,$CTA0("Creating Button Error"),$CTA0("Error"),MB_OK
.endif
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
end start
А что на счёт ТАКОГО кода... то это я просто пример на wasm.ru с Delphi перевёл на Assembler и всё... Не люблю Delphi за громоздкость... и код там генерируется хрен знает как... А в Assembler'е всё понятно - что написал - то и есть!
Просто пока переводил понял суть всех этих хитрых манипуляций.
Зачем Mutex, зачем Hook ставить на WH_GETMESSAGE и т.д.
Там примерчик был типа, как стать невидимым для TaskManedger'а, но ведь можно же, поняв суть, сделать и что-то другое, сделать RegMonitor своими руками, замочить вирус, который вырубает комп, отслеживать создание файлов или скрыть файлы, чтоб твою фирму не оштрафовали за использование нелицензионных программ и т.д. и т.п.
Слушай, а знаешь ГДЕ надо писать код, чтобы он выполнялся только ПОСЛЕ ПОЛНОЙ загрузки программы?
Немного смысла не понял...
Я всегда думал, что вначале программа загружается, а потом уже исполняется её код, поэтому первая же команда исполняется после "полной" загрузки!
А затем что-то типа call your_function, ну или вызов твоей функции.
На чём пишешь?
С++ Builder?
Если вначале код исполняется, то значит просто с компилятором разберись.
Я ж не знаю как там у тебя.
Может быть у тебя компилятор сам окна рисует типа графически, а код окна тебе не показывает. А то, что ты пишешь выполняется почему-то до создания окна. Значит разберись с компилятором.
В Assembler'е всё понятно, что написал - то и будет и именно в такой последовательности!
А ты хотел исходник кинуть?
Видел я 2005 Studio. Там и C# и C++ есть...
Класная штука!
Но себе такой ещё не достал...
У меня есть только Microsoft Visual Studio C++ 6.0.
Короче, я вкладочку тебе сделаю. Глянешь там мой пример. Исходники прилагаются.
Обрати внимание на это:
(Может быть это как раз что нужно)
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
;Создаётся окно!
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
;Окно отображается!
call Some ; Это некая функция, которая что-то делает!
;invoke CreateThread,0h,0h,offset Some,0h,0h,offset ThreadId
А это Some:
xor ecx,ecx
.WHILE ecx < 0FFED0000h
inc ecx
xor edx,edx
.ENDW
invoke MessageBox,0h,$CTA0("Hello"),$CTA0("Hello"),MB_OK
;invoke ExitThread,0h
ret
Some endp
Ну, тут просто цикл, который время занимает!
Если запустишь это, то комп вначале создаст окно! (Как тебе надо!)
А потом висит! Это он в цикле висит!
Можно этот цикл в отдельный поток загнать вот так:
invoke CreateThread,0h,0h,offset Some,0h,0h,offset ThreadId
Который потом завершить вот так:
invoke ExitThread,0h
Вот и всё!
.model flat, stdcall
option casemap :none
include E:\masm32\include\windows.inc
include E:\masm32\include\user32.inc
include E:\masm32\include\kernel32.inc
includelib E:\masm32\lib\user32.lib
includelib E:\masm32\lib\kernel32.lib
include E:\masm32\macros\Strings.mac
include E:\masm32\include\w2k\ntstatus.inc
include E:\masm32\include\w2k\native.inc
include E:\masm32\include\w2k\ntdll.inc
includelib E:\masm32\lib\w2k\ntdll.lib
Minute equ 0EA60h
BYTES struc
jmpcode db ?
addrcode dd ?
retcode db ?
BYTES ends
.data?
hInstance dd ?
ZwAddr dd ?
hook_handle dd ?
old_bytes BYTES <>
new_bytes BYTES <>
.code
LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
.if reason == DLL_PROCESS_ATTACH
push instance
pop hInstance
call SetGlobalHook
call SetHook
mov eax, TRUE
.elseif reason == DLL_PROCESS_DETACH
call Unhook
;push instance
;pop hInstance
;mov eax, TRUE
;mov eax,1h
.elseif reason == DLL_THREAD_ATTACH
.elseif reason == DLL_THREAD_DETACH
.endif
ret
LibMain endp
NewZwQuerySystemInformation proc ASystemInformationClass:DWORD,ASystemInformation:DWORD,ASystemInformationLength:DWORD,AReturnLength:DWORD
local rwbytes:DWORD
local myId:DWORD
local process_handle:DWORD
local dwMemAddr:DWORD
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
invoke ZwQuerySystemInformation,ASystemInformationClass,ASystemInformation,ASystemInformationLength,AReturnLength
push eax
invoke GetCurrentProcessId
mov myId,eax
invoke OpenProcess,PROCESS_TERMINATE,FALSE,myId
.if eax!=0h
mov process_handle,eax
invoke VirtualAlloc,0h,1000h,MEM_COMMIT,PAGE_READWRITE
mov dwMemAddr,eax
invoke GetModuleFileName,process_handle,dwMemAddr,1000h
invoke lstrlen,dwMemAddr
mov esi,dwMemAddr
add esi,eax
CTA0 "taskmng.exe",szTaskMngStr
invoke lstrlen,szTaskMngStr
sub esi,eax
invoke lstrcmp,esi,addr szTaskMngStr
.if eax==0h
invoke ExitProcess,0h
.endif
invoke CloseHandle,process_handle
invoke VirtualFree,dwMemAddr,1000h,MEM_DECOMMIT
.endif
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset new_bytes,6h,addr rwbytes
pop eax
ret
NewZwQuerySystemInformation endp
SetHook proc
local rwbytes:DWORD
invoke GetModuleHandle,$CTA0("ntdll.dll")
invoke GetProcAddress,eax,$CTA0("ZwQuerySystemInformation")
mov dword ptr ZwAddr,eax
invoke ReadProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
push esi
mov esi,offset new_bytes
assume esi:ptr BYTES
mov [esi].jmpcode,68h
mov [esi].addrcode,offset NewZwQuerySystemInformation
mov [esi].retcode,0C3h
assume esi:nothing
pop esi
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset new_bytes,6h,addr rwbytes
ret
SetHook endp
MessageProc proc Code:DWORD,wParam:DWORD,lParam:DWORD
invoke CallNextHookEx,0h,dword ptr Code,dword ptr wParam,dword ptr lParam
mov eax,0h
ret
MessageProc endp
SetGlobalHookProc proc
invoke SetWindowsHookEx,WH_GETMESSAGE,offset MessageProc,dword ptr hInstance,0h
.if eax==0h
.else
mov dword ptr hook_handle,eax
.endif
invoke Sleep,INFINITE
ret
SetGlobalHookProc endp
SetGlobalHook proc
local TrId:DWORD
local hMutex:DWORD
invoke CreateMutex,0h,FALSE,$CTA0("SomeString")
.if eax!=0
invoke CreateThread,0h,0h,offset SetGlobalHookProc,0h,0h,addr TrId
.if eax==0h
.else
.endif
invoke CloseHandle,dword ptr hMutex
.endif
ret
SetGlobalHook endp
Unhook proc
local rwbytes:DWORD
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
ret
Unhook endp
end LibMain
Функция перехвата:
local rwbytes:DWORD
local myId:DWORD
local process_handle:DWORD
local dwMemAddr:DWORD
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
invoke ZwQuerySystemInformation,ASystemInformationClass,ASystemInformation,ASystemInformationLength,AReturnLength
push eax
;Получаем Id текущего процесса!
invoke GetCurrentProcessId
mov myId,eax
;Открываем этот процесс - получаем его Handle!
invoke OpenProcess,PROCESS_TERMINATE,FALSE,myId
.if eax!=0h
mov process_handle,eax
;Можно и без этого...
invoke VirtualAlloc,0h,1000h,MEM_COMMIT,PAGE_READWRITE
mov dwMemAddr,eax
;Определяем полный путь к процессу!
invoke GetModuleFileName,process_handle,dwMemAddr,1000h
invoke lstrlen,dwMemAddr
mov esi,dwMemAddr
add esi,eax
;Строчка для сравнения!
CTA0 "taskmng.exe",szTaskMngStr
;Получаем длинну этой строчки...
invoke lstrlen,szTaskMngStr
sub esi,eax
;Если строки равны, то значит это TaskMng.exe - значит мочим его
;просто тупым вызовом ExitProcess!
invoke lstrcmp,esi,addr szTaskMngStr
.if eax==0h
invoke ExitProcess,0h
.endif
invoke CloseHandle,process_handle
invoke VirtualFree,dwMemAddr,1000h,MEM_DECOMMIT
.endif
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset new_bytes,6h,addr rwbytes
pop eax
ret
NewZwQuerySystemInformation endp
И ещё где-то тут ошибка у меня логическая:
invoke lstrlen,dwMemAddr
mov esi,dwMemAddr
add esi,eax
;Строчка для сравнения!
CTA0 "taskmng.exe",szTaskMngStr
;Получаем длинну этой строчки...
invoke lstrlen,szTaskMngStr
sub esi,eax
;Если строки равны, то значит это TaskMng.exe - значит мочим его
;просто тупым вызовом ExitProcess!
invoke lstrcmp,esi,addr szTaskMngStr
.if eax==0h
invoke ExitProcess,0h
.endif
Короче работает, но некорректно как-то...
Суть, короче, такая, что ты получаешь строку исполняемого процесса и смотришь - taskmng.exe это или нет. Если это taskmng.exe, то надо его завершить!
Просто неохото было это отлаживать до конца...
Думаю, принцип понятен...
Может быть это то, что тебе надо...
Зато я понял как делать кнопки без MFC!!!
HWND button;
//Вот сам код:
button = CreateWindow(
"BUTTON", // класс(в нашем случае кнопка)
"ДА! ДА! ДА!", // текст кнопки
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,/* стили(посмотришь в MSDN) */
10, // х координата кнопки
10, // у координата кнопки
100, // ширина кнопки
100, // высота кнопки
hWnd, // в каком окне создавать эту кнопку
NULL, // Без меню
hInstance,//сам не понял че это такое
NULL); // тут тоже
Но зато я пока не понял как привязать кнопку к опр. дейст
Кстати, может проще пообщатся в асе? Если да, стучи 476415547
Просто мне бы не очень охото было бы тупо переписывать это на C++ ещё...
Ещё чем мне нравится Assembler - это наличие отладчиков, типа Olly!
Хотя, надо отметить, что есть и встроенные отладчики как в Delphi, так и в C++...
На C++ это переписать можно...
Попробуй...
http://wasm.ru/print.php?article=apihook_1
Скачай ProcHide (10 кб) там архив.
Исходник на Delphi - с ним тебе возможно проще будет...
Но зато я пока не понял как привязать кнопку к опр. дейст
Это просто делается. Там где у тебя оконная фунция с параметрами: WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
там есть длинный switch!
Вот как раз в нём и идёт обработка сообщений и от кнопок и т.д.
Асю можно, но не сегодня...
Кстати, спасибо за Кнопку!
Попробую разобраться на досуге!
А hInstance - это, кажется, что-то связанное с Handle'ом твоего процесса или это и есть Handle твоего процесса!
Глянь вкладочку!
.model flat, stdcall
option casemap :none
include E:\masm32\include\windows.inc
include E:\masm32\include\user32.inc
include E:\masm32\include\kernel32.inc
includelib E:\masm32\lib\user32.lib
includelib E:\masm32\lib\kernel32.lib
include E:\masm32\macros\Strings.mac
include E:\masm32\include\w2k\ntstatus.inc
include E:\masm32\include\w2k\native.inc
include E:\masm32\include\w2k\ntdll.inc
includelib E:\masm32\lib\w2k\ntdll.lib
Minute equ 0EA60h
BYTES struc
jmpcode db ?
addrcode dd ?
retcode db ?
BYTES ends
.data?
hInstance dd ?
ZwAddr dd ?
hook_handle dd ?
old_bytes BYTES <>
new_bytes BYTES <>
.code
LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
.if reason == DLL_PROCESS_ATTACH
push instance
pop hInstance
call SetGlobalHook
call SetHook
mov eax, TRUE
.elseif reason == DLL_PROCESS_DETACH
call Unhook
;push instance
;pop hInstance
;mov eax, TRUE
;mov eax,1h
.elseif reason == DLL_THREAD_ATTACH
.elseif reason == DLL_THREAD_DETACH
.endif
ret
LibMain endp
comment @
LibMain proc instance:DWORD,reason:DWORD,unused:DWORD
mov al,1
ret 12
LibMain endp
@
My proc
call SetGlobalHook
call SetHook
ret
My endp
NewZwQuerySystemInformation proc ASystemInformationClass:DWORD,ASystemInformation:DWORD,ASystemInformationLength:DWORD,AReturnLength:DWORD
local rwbytes:DWORD
local myId:DWORD
local process_handle:DWORD
local dwMemAddr:DWORD
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
invoke ZwQuerySystemInformation,ASystemInformationClass,ASystemInformation,ASystemInformationLength,AReturnLength
pusha
invoke VirtualAlloc,0h,1000h,MEM_COMMIT,PAGE_READWRITE
mov dwMemAddr,eax
invoke GetModuleHandle,0h
invoke GetModuleFileName,eax,dwMemAddr,1000h
mov esi,dwMemAddr
add esi,eax
CTA0 "taskmgr.exe",szTaskMngStr
mov eax,sizeof szTaskMngStr-1
sub esi,eax
;invoke lstrcmpi,esi,offset szTaskMngStr
mov ecx,sizeof szTaskMngStr-1
mov edi,offset szTaskMngStr
repe cmpsb
.if ecx==0h
invoke ExitProcess,0h
.endif
invoke VirtualFree,dwMemAddr,1000h,MEM_DECOMMIT
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset new_bytes,6h,addr rwbytes
popa
ret
NewZwQuerySystemInformation endp
SetHook proc
local rwbytes:DWORD
invoke GetModuleHandle,$CTA0("ntdll.dll")
invoke GetProcAddress,eax,$CTA0("ZwQuerySystemInformation")
mov dword ptr ZwAddr,eax
invoke ReadProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
push esi
mov esi,offset new_bytes
assume esi:ptr BYTES
mov [esi].jmpcode,68h
mov [esi].addrcode,offset NewZwQuerySystemInformation
mov [esi].retcode,0C3h
assume esi:nothing
pop esi
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset new_bytes,6h,addr rwbytes
ret
SetHook endp
MessageProc proc Code:DWORD,wParam:DWORD,lParam:DWORD
invoke CallNextHookEx,0h,dword ptr Code,dword ptr wParam,dword ptr lParam
mov eax,0h
ret
MessageProc endp
SetGlobalHookProc proc
invoke SetWindowsHookEx,WH_GETMESSAGE,offset MessageProc,dword ptr hInstance,0h
.if eax==0h
.else
mov dword ptr hook_handle,eax
.endif
invoke Sleep,INFINITE
ret
SetGlobalHookProc endp
SetGlobalHook proc
local TrId:DWORD
local hMutex:DWORD
invoke CreateMutex,0h,FALSE,$CTA0("MyString")
.if eax!=0
invoke CreateThread,0h,0h,offset SetGlobalHookProc,0h,0h,addr TrId
.if eax==0h
.else
.endif
invoke CloseHandle,dword ptr hMutex
.endif
ret
SetGlobalHook endp
Unhook proc
;invoke MessageBox,0h,$CTA0("Goodbuy"),$CTA0("Goodbuy"),MB_OK
local rwbytes:DWORD
invoke WriteProcessMemory,INVALID_HANDLE_VALUE,dword ptr ZwAddr,offset old_bytes,6h,addr rwbytes
ret
Unhook endp
end LibMain
Только вот новых парочку вопросов:
1. Как использовать функцию Opacity. Только в MSDN не посылать, там я уже был :) До меня не дошло.
2. Использование кнопки
button = CreateWindow("BUTTON","ДА! ДА! ДА!",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,500,75,100,50,hWnd,NULL, hInstance,NULL);
где switch?
или switch в LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)?
Тогда какой case? case WM_BUTTON или как?
Первый раз слышу?
Opacity?
switch в LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Именно там!!!
Наверное case WM_BUTTON...
Точно не знаю сам пока...
Пока этим не занимался ещё...
Но хотел бы...
[quote=HexEdit]
Как сделать окно прозрачным?
Код:
SetWindowLong(hWnd, GWL_EX_STYLE,
GetWindowLong(hWnd, GWL_EX_STYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0, <прозрачность_1..255>, LWA_ALPHA);
Прозрачность:
0 - полностью прозрачно, клики проходят сквозь
1 - полностью прозрачно, клики проходят на окно
255 - не прозрачно
Примечание:
Работает только с Win2000. С этой функцией на предыдущих версиях программа не запустится.
[/quote]
Нашёл прямо тут!
Таким образом, делаем вывод, что скорее всего это Свойство.
Свойства - это некие упрощения, которые дарят нам Дельфиноподобные языки высокого уровня, отгораживая нас от вызова реальных API!
Думаю, что без разницы, что использовать, свойство или API-функцию - эффект должен быть тот же самый!
Вопрос в том, поддерживает ли это Свойство компилятор?
Если нет, то надо использовать API!
Например, в Delphi вообще ничего писать не надо - там есть свойства AlphaBlend и AlphaBlendValue, которые редактируются в инспекторе объектов. И всё!
HWND button = CreateWindow("BUTTON","ДА! ДА! ДА!",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,500,75,100,50,hWnd,NULL, hInstance,NULL);
// Устанавливаем ее индефикатор
SetWindowLong(button,GWL_ID,1);
/*
.....
*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_COMMAND: {
switch(wParam) { // выбор по номеру кнопки
case 1: {
MessageBox(hWnd,"La","La-La", ID_ICONINFORMATION);
}break;
}
} break;
/*
.....
*/
}
Буду знать теперь как идентификатор кнопки установить!
А то я .if писал...