Сам себе зумер

 

Давненько пользуюсь программой 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

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

Думаю, что для увеличения нужно использовать StretchBlt, попробую на днях. "А как быть со стандартной программой?" - спросит юзер. А стандартная программа не годится, да и неудобная.

Дополнение. Собрал программу, как планировалось. Как обычно, 360 Total Security считает, что вирус.

Комментарии