Давненько пользуюсь программой ZoomView, но при запуске в Windows 10 прога перестала правильно. Решил написать свою версию с закосом под х64. Поразительно, моя же программа стала работать некорректно. Стал разбираться, в чем заморочка. Гугл выдал массу ссылок на решение проблемы, которая таится в неверной работе функции GetCursorPos. Оказывается, что есть другая библиотека user32.dll, которая фунциклирует правильно.
Хорошо, написал на PureBasic код, и ошибки повалились. Проблема в Unicode, который используется в винде. Поэтому простой поиск функций не заработал - вызвать LoadLibrary, GetProcAddress. День раздумий и меня осенило, вот так выглядел код:
*m=AllocateMemory(32)
hdll=LoadLibrary_("user32.dll")
hfu=GetProcAddress_(hdll,?fu);"GetCursorPos")
If hfu=0
Debug "err:"+Str(GetLastError_())
End
EndIf
hdll=LoadLibrary_("user32.dll")
hfu=GetProcAddress_(hdll,?fu);"GetCursorPos")
If hfu=0
Debug "err:"+Str(GetLastError_())
End
EndIf
If OpenWindow(0, 0, 0, 400, 300, "zoomview", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
;ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
AddWindowTimer(0, 123, 100)
SetWindowColor(0, RGB(0,0,255))
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer; And EventTimer() = 123
;p.POINT
;GetCursorPos_(@p)
CallFunctionFast(hfu,*m)
py.l=PeekL(*m+4)
px.l=PeekL(*m)
;SetWindowTitle(0,Hex(py,#PB_Long)+":"+Hex(px,#PB_Long))
ddc=GetWindowDC_(GetDesktopWindow_())
wdc=GetWindowDC_(WindowID(0))
BitBlt_(wdc,0,GetSystemMetrics_(#SM_CYSMCAPTION),400,300,ddc,px,py,#SRCCOPY)
; BOOL BitBlt(
;
; HDC hdcDest, // handle To destination device context
; int nXDest, // x-coordinate of destination rectangle's upper-left corner
; int nYDest, // y-coordinate of destination rectangle's upper-left corner
; int nWidth, // width of destination rectangle
; int nHeight, // height of destination rectangle
; HDC hdcSrc, // handle To source device context
; int nXSrc, // x-coordinate of source rectangle's upper-left corner
; int nYSrc, // y-coordinate of source rectangle's upper-left corner
; DWORD dwRop // raster operation code
; );
ReleaseDC_(GetDesktopWindow_(),ddc)
ReleaseDC_(WindowID(0),wdc)
;EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
FreeLibrary_(hdll)
FreeMemory(*m)
DataSection
fu:
Data.a 71,101,116,67,117,114,115,111,114,80,111,115,0
; IDE Options = PureBasic 5.72 (Windows - x64)
; CursorPosition = 28
; FirstLine = 27
; EnableXP
;ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
AddWindowTimer(0, 123, 100)
SetWindowColor(0, RGB(0,0,255))
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer; And EventTimer() = 123
;p.POINT
;GetCursorPos_(@p)
CallFunctionFast(hfu,*m)
py.l=PeekL(*m+4)
px.l=PeekL(*m)
;SetWindowTitle(0,Hex(py,#PB_Long)+":"+Hex(px,#PB_Long))
ddc=GetWindowDC_(GetDesktopWindow_())
wdc=GetWindowDC_(WindowID(0))
BitBlt_(wdc,0,GetSystemMetrics_(#SM_CYSMCAPTION),400,300,ddc,px,py,#SRCCOPY)
; BOOL BitBlt(
;
; HDC hdcDest, // handle To destination device context
; int nXDest, // x-coordinate of destination rectangle's upper-left corner
; int nYDest, // y-coordinate of destination rectangle's upper-left corner
; int nWidth, // width of destination rectangle
; int nHeight, // height of destination rectangle
; HDC hdcSrc, // handle To source device context
; int nXSrc, // x-coordinate of source rectangle's upper-left corner
; int nYSrc, // y-coordinate of source rectangle's upper-left corner
; DWORD dwRop // raster operation code
; );
ReleaseDC_(GetDesktopWindow_(),ddc)
ReleaseDC_(WindowID(0),wdc)
;EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
FreeLibrary_(hdll)
FreeMemory(*m)
DataSection
fu:
Data.a 71,101,116,67,117,114,115,111,114,80,111,115,0
; IDE Options = PureBasic 5.72 (Windows - x64)
; CursorPosition = 28
; FirstLine = 27
; EnableXP
Думаю, что для увеличения нужно использовать StretchBlt, попробую на днях. "А как быть со стандартной программой?" - спросит юзер. А стандартная программа не годится, да и неудобная.
Дополнение. Собрал программу, как планировалось. Как обычно, 360 Total Security считает, что вирус.
Комментарии
Отправить комментарий